Completed
Push — master ( 3caaa9...7e8601 )
by cam
01:42
created
ecrire/public/references.php 1 patch
Indentation   +526 added lines, -526 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Compilateur\References
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -41,14 +41,14 @@  discard block
 block discarded – undo
41 41
  *     - '' si une référence explicite incorrecte est envoyée
42 42
  */
43 43
 function index_boucle($p) {
44
-	if (strlen($p->nom_boucle)) {
45
-		// retourne l’index explicite demandé s’il existe
46
-		if (!empty($p->boucles[$p->nom_boucle])) {
47
-			return $p->nom_boucle;
48
-		}
49
-		return '';
50
-	}
51
-	return $p->id_boucle;
44
+    if (strlen($p->nom_boucle)) {
45
+        // retourne l’index explicite demandé s’il existe
46
+        if (!empty($p->boucles[$p->nom_boucle])) {
47
+            return $p->nom_boucle;
48
+        }
49
+        return '';
50
+    }
51
+    return $p->id_boucle;
52 52
 }
53 53
 
54 54
 
@@ -71,17 +71,17 @@  discard block
 block discarded – undo
71 71
  *     - '' si une référence explicite incorrecte est envoyée
72 72
  */
73 73
 function index_boucle_mere($p) {
74
-	if (strlen($p->nom_boucle)) {
75
-		// retourne l’index explicite demandé s’il existe
76
-		if (!empty($p->boucles[$p->nom_boucle])) {
77
-			return $p->nom_boucle;
78
-		}
79
-		return '';
80
-	}
81
-	if (!empty($p->descr['id_mere'])) {
82
-		return $p->descr['id_mere'];
83
-	}
84
-	return '';
74
+    if (strlen($p->nom_boucle)) {
75
+        // retourne l’index explicite demandé s’il existe
76
+        if (!empty($p->boucles[$p->nom_boucle])) {
77
+            return $p->nom_boucle;
78
+        }
79
+        return '';
80
+    }
81
+    if (!empty($p->descr['id_mere'])) {
82
+        return $p->descr['id_mere'];
83
+    }
84
+    return '';
85 85
 }
86 86
 
87 87
 /**
@@ -115,74 +115,74 @@  discard block
 block discarded – undo
115 115
  *     Code PHP pour obtenir le champ SQL
116 116
  */
117 117
 function index_pile(
118
-	$idb,
119
-	$nom_champ,
120
-	&$boucles,
121
-	$explicite = '',
122
-	$defaut = null,
123
-	$remonte_pile = true,
124
-	$select = true
118
+    $idb,
119
+    $nom_champ,
120
+    &$boucles,
121
+    $explicite = '',
122
+    $defaut = null,
123
+    $remonte_pile = true,
124
+    $select = true
125 125
 ) {
126
-	if (!is_string($defaut)) {
127
-		$defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)';
128
-	}
129
-
130
-	$idb_origine = $idb;
131
-	$nom_champ_origine = $nom_champ;
132
-
133
-	$i = 0;
134
-	if (strlen($explicite)) {
135
-		// Recherche d'un champ dans un etage superieur
136
-		while (($idb !== $explicite) && ($idb !== '')) {
137
-			#	spip_log("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'");
138
-			$i++;
139
-			$idb = $boucles[$idb]->id_parent;
140
-		}
141
-	}
142
-
143
-	#	spip_log("Cherche: $nom_champ a partir de '$idb'");
144
-	$nom_champ = strtolower($nom_champ);
145
-	$conditionnel = [];
146
-	// attention: entre la boucle nommee 0, "" et le tableau vide,
147
-	// il y a incoherences qu'il vaut mieux eviter
148
-	while (isset($boucles[$idb])) {
149
-		$joker = true;
150
-		// modifie $joker si tous les champs sont autorisés.
151
-		// $t = le select pour le champ, si on l'a trouvé (ou si joker)
152
-		// $c = le nom du champ demandé
153
-		[$t, $c] = index_tables_en_pile($idb, $nom_champ, $boucles, $joker);
154
-		if ($t) {
155
-			if ($select and !in_array($t, $boucles[$idb]->select)) {
156
-				$boucles[$idb]->select[] = $t;
157
-			}
158
-			// renseigner la boucle source de ce champ pour les traitements
159
-			$boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb;
160
-			$champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']';
161
-			if (!$joker) {
162
-				return index_compose($conditionnel, $champ);
163
-			}
164
-
165
-			// tant que l'on trouve des tables avec joker, on continue
166
-			// avec la boucle parente et on conditionne à l'exécution
167
-			// la présence du champ. Si le champ existe à l'exécution
168
-			// dans une boucle, il est pris, sinon on le cherche dans le parent...
169
-			$conditionnel[] = "isset($champ)?$champ";
170
-		}
171
-
172
-		if ($remonte_pile) {
173
-			#	spip_log("On remonte vers $i");
174
-			// Sinon on remonte d'un cran
175
-			$idb = $boucles[$idb]->id_parent;
176
-			$i++;
177
-		} else {
178
-			$idb = null;
179
-		}
180
-	}
181
-
182
-	#	spip_log("Pas vu $nom_champ");
183
-	// esperons qu'il y sera
184
-	// ou qu'on a fourni une valeur par "defaut" plus pertinent
185
-	return index_compose($conditionnel, $defaut);
126
+    if (!is_string($defaut)) {
127
+        $defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)';
128
+    }
129
+
130
+    $idb_origine = $idb;
131
+    $nom_champ_origine = $nom_champ;
132
+
133
+    $i = 0;
134
+    if (strlen($explicite)) {
135
+        // Recherche d'un champ dans un etage superieur
136
+        while (($idb !== $explicite) && ($idb !== '')) {
137
+            #	spip_log("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'");
138
+            $i++;
139
+            $idb = $boucles[$idb]->id_parent;
140
+        }
141
+    }
142
+
143
+    #	spip_log("Cherche: $nom_champ a partir de '$idb'");
144
+    $nom_champ = strtolower($nom_champ);
145
+    $conditionnel = [];
146
+    // attention: entre la boucle nommee 0, "" et le tableau vide,
147
+    // il y a incoherences qu'il vaut mieux eviter
148
+    while (isset($boucles[$idb])) {
149
+        $joker = true;
150
+        // modifie $joker si tous les champs sont autorisés.
151
+        // $t = le select pour le champ, si on l'a trouvé (ou si joker)
152
+        // $c = le nom du champ demandé
153
+        [$t, $c] = index_tables_en_pile($idb, $nom_champ, $boucles, $joker);
154
+        if ($t) {
155
+            if ($select and !in_array($t, $boucles[$idb]->select)) {
156
+                $boucles[$idb]->select[] = $t;
157
+            }
158
+            // renseigner la boucle source de ce champ pour les traitements
159
+            $boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb;
160
+            $champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']';
161
+            if (!$joker) {
162
+                return index_compose($conditionnel, $champ);
163
+            }
164
+
165
+            // tant que l'on trouve des tables avec joker, on continue
166
+            // avec la boucle parente et on conditionne à l'exécution
167
+            // la présence du champ. Si le champ existe à l'exécution
168
+            // dans une boucle, il est pris, sinon on le cherche dans le parent...
169
+            $conditionnel[] = "isset($champ)?$champ";
170
+        }
171
+
172
+        if ($remonte_pile) {
173
+            #	spip_log("On remonte vers $i");
174
+            // Sinon on remonte d'un cran
175
+            $idb = $boucles[$idb]->id_parent;
176
+            $i++;
177
+        } else {
178
+            $idb = null;
179
+        }
180
+    }
181
+
182
+    #	spip_log("Pas vu $nom_champ");
183
+    // esperons qu'il y sera
184
+    // ou qu'on a fourni une valeur par "defaut" plus pertinent
185
+    return index_compose($conditionnel, $defaut);
186 186
 }
187 187
 
188 188
 /**
@@ -196,12 +196,12 @@  discard block
 block discarded – undo
196 196
  * @return string              Code PHP complet de recherche d'un champ
197 197
  */
198 198
 function index_compose($conditionnel, $defaut) {
199
-	while ($c = array_pop($conditionnel)) {
200
-		// si on passe defaut = '', ne pas générer d'erreur de compilation.
201
-		$defaut = "($c:(" . ($defaut ?: "''") . '))';
202
-	}
199
+    while ($c = array_pop($conditionnel)) {
200
+        // si on passe defaut = '', ne pas générer d'erreur de compilation.
201
+        $defaut = "($c:(" . ($defaut ?: "''") . '))';
202
+    }
203 203
 
204
-	return $defaut;
204
+    return $defaut;
205 205
 }
206 206
 
207 207
 /**
@@ -237,77 +237,77 @@  discard block
 block discarded – undo
237 237
  **/
238 238
 function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) {
239 239
 
240
-	$r = $boucles[$idb]->type_requete;
241
-	// boucle recursive, c'est foutu...
242
-	if ($r == TYPE_RECURSIF) {
243
-		return [];
244
-	}
245
-	if (!$r) {
246
-		$joker = false; // indiquer a l'appelant
247
-		# continuer pour chercher l'erreur suivante
248
-		return ["'#" . $r . ':' . $nom_champ . "'", ''];
249
-	}
250
-
251
-	$desc = $boucles[$idb]->show;
252
-	// le nom du champ est il une exception de la table ? un alias ?
253
-	$excep = $GLOBALS['exceptions_des_tables'][$r] ?? '';
254
-	if ($excep) {
255
-		$excep = $excep[$nom_champ] ?? '';
256
-	}
257
-	if ($excep) {
258
-		$joker = false; // indiquer a l'appelant
259
-		return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
260
-	} // pas d'alias. Le champ existe t'il ?
261
-	else {
262
-		// le champ est réellement présent, on le prend.
263
-		if (isset($desc['field'][$nom_champ])) {
264
-			$t = $boucles[$idb]->id_table;
265
-			$joker = false; // indiquer a l'appelant
266
-			return ["$t.$nom_champ", $nom_champ];
267
-		}
268
-		// Tous les champs sont-ils acceptés ?
269
-		// Si oui, on retourne le champ, et on lève le flag joker
270
-		// C'est le cas des itérateurs DATA qui acceptent tout
271
-		// et testent la présence du champ à l'exécution et non à la compilation
272
-		// car ils ne connaissent pas ici leurs contenus.
273
-		elseif (
240
+    $r = $boucles[$idb]->type_requete;
241
+    // boucle recursive, c'est foutu...
242
+    if ($r == TYPE_RECURSIF) {
243
+        return [];
244
+    }
245
+    if (!$r) {
246
+        $joker = false; // indiquer a l'appelant
247
+        # continuer pour chercher l'erreur suivante
248
+        return ["'#" . $r . ':' . $nom_champ . "'", ''];
249
+    }
250
+
251
+    $desc = $boucles[$idb]->show;
252
+    // le nom du champ est il une exception de la table ? un alias ?
253
+    $excep = $GLOBALS['exceptions_des_tables'][$r] ?? '';
254
+    if ($excep) {
255
+        $excep = $excep[$nom_champ] ?? '';
256
+    }
257
+    if ($excep) {
258
+        $joker = false; // indiquer a l'appelant
259
+        return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
260
+    } // pas d'alias. Le champ existe t'il ?
261
+    else {
262
+        // le champ est réellement présent, on le prend.
263
+        if (isset($desc['field'][$nom_champ])) {
264
+            $t = $boucles[$idb]->id_table;
265
+            $joker = false; // indiquer a l'appelant
266
+            return ["$t.$nom_champ", $nom_champ];
267
+        }
268
+        // Tous les champs sont-ils acceptés ?
269
+        // Si oui, on retourne le champ, et on lève le flag joker
270
+        // C'est le cas des itérateurs DATA qui acceptent tout
271
+        // et testent la présence du champ à l'exécution et non à la compilation
272
+        // car ils ne connaissent pas ici leurs contenus.
273
+        elseif (
274 274
 /*$joker AND */
275
-			isset($desc['field']['*'])
276
-		) {
277
-			$joker = true; // indiquer a l'appelant
278
-			return [$nom_champ, $nom_champ];
279
-		}
280
-		// pas d'alias, pas de champ, pas de joker...
281
-		// tenter via une jointure...
282
-		else {
283
-			$joker = false; // indiquer a l'appelant
284
-			// regarder si le champ est deja dans une jointure existante
285
-			// sinon, si il y a des joitures explicites, la construire
286
-			if (!$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) {
287
-				if ($boucles[$idb]->jointures_explicites) {
288
-					// [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!!
289
-					// fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites
290
-					// mais est-ce ce qu'on veut ?
291
-					$jointures = preg_split('/\s+/', $boucles[$idb]->jointures_explicites);
292
-					if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) {
293
-						$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]);
294
-					}
295
-				}
296
-			}
297
-			if ($t) {
298
-				// si on a trouvé une jointure possible, on fait comme
299
-				// si c'était une exception pour le champ demandé
300
-				return index_exception(
301
-					$boucles[$idb],
302
-					$desc,
303
-					$nom_champ,
304
-					[$t[1]['id_table'], reset($t[2])]
305
-				);
306
-			}
307
-
308
-			return ['', ''];
309
-		}
310
-	}
275
+            isset($desc['field']['*'])
276
+        ) {
277
+            $joker = true; // indiquer a l'appelant
278
+            return [$nom_champ, $nom_champ];
279
+        }
280
+        // pas d'alias, pas de champ, pas de joker...
281
+        // tenter via une jointure...
282
+        else {
283
+            $joker = false; // indiquer a l'appelant
284
+            // regarder si le champ est deja dans une jointure existante
285
+            // sinon, si il y a des joitures explicites, la construire
286
+            if (!$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) {
287
+                if ($boucles[$idb]->jointures_explicites) {
288
+                    // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!!
289
+                    // fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites
290
+                    // mais est-ce ce qu'on veut ?
291
+                    $jointures = preg_split('/\s+/', $boucles[$idb]->jointures_explicites);
292
+                    if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) {
293
+                        $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]);
294
+                    }
295
+                }
296
+            }
297
+            if ($t) {
298
+                // si on a trouvé une jointure possible, on fait comme
299
+                // si c'était une exception pour le champ demandé
300
+                return index_exception(
301
+                    $boucles[$idb],
302
+                    $desc,
303
+                    $nom_champ,
304
+                    [$t[1]['id_table'], reset($t[2])]
305
+                );
306
+            }
307
+
308
+            return ['', ''];
309
+        }
310
+    }
311 311
 }
312 312
 
313 313
 
@@ -335,52 +335,52 @@  discard block
 block discarded – undo
335 335
  *     est une expression pour le SELECT de la boucle du style "mots.titre AS titre_mot"
336 336
  **/
337 337
 function index_exception(&$boucle, $desc, $nom_champ, $excep) {
338
-	static $trouver_table;
339
-	if (!$trouver_table) {
340
-		$trouver_table = charger_fonction('trouver_table', 'base');
341
-	}
342
-
343
-	if (is_array($excep)) {
344
-		// permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
345
-		$t = null;
346
-		if (count($excep) == 3) {
347
-			$index_exception_derogatoire = array_pop($excep);
348
-			$t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
349
-		}
350
-		if ($t == null) {
351
-			[$e, $x] = $excep;  #PHP4 affecte de gauche a droite
352
-			$excep = $x;    #PHP5 de droite a gauche !
353
-			$j = $trouver_table($e, $boucle->sql_serveur);
354
-			if (!$j) {
355
-				return ['', ''];
356
-			}
357
-			$e = $j['table'];
358
-			if (!$t = array_search($e, $boucle->from)) {
359
-				$k = $j['key']['PRIMARY KEY'];
360
-				if (strpos($k, ',')) {
361
-					$l = (preg_split('/\s*,\s*/', $k));
362
-					$k = $desc['key']['PRIMARY KEY'];
363
-					if (!in_array($k, $l)) {
364
-						spip_log("jointure impossible $e " . join(',', $l));
365
-
366
-						return ['', ''];
367
-					}
368
-				}
369
-				$k = [$boucle->id_table, [$e], $k];
370
-				fabrique_jointures($boucle, [$k]);
371
-				$t = array_search($e, $boucle->from);
372
-			}
373
-		}
374
-	} else {
375
-		$t = $boucle->id_table;
376
-	}
377
-	// demander a SQL de gerer le synonyme
378
-	// ca permet que excep soit dynamique (Cedric, 2/3/06)
379
-	if ($excep != $nom_champ) {
380
-		$excep .= ' AS ' . $nom_champ;
381
-	}
382
-
383
-	return ["$t.$excep", $nom_champ];
338
+    static $trouver_table;
339
+    if (!$trouver_table) {
340
+        $trouver_table = charger_fonction('trouver_table', 'base');
341
+    }
342
+
343
+    if (is_array($excep)) {
344
+        // permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
345
+        $t = null;
346
+        if (count($excep) == 3) {
347
+            $index_exception_derogatoire = array_pop($excep);
348
+            $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
349
+        }
350
+        if ($t == null) {
351
+            [$e, $x] = $excep;  #PHP4 affecte de gauche a droite
352
+            $excep = $x;    #PHP5 de droite a gauche !
353
+            $j = $trouver_table($e, $boucle->sql_serveur);
354
+            if (!$j) {
355
+                return ['', ''];
356
+            }
357
+            $e = $j['table'];
358
+            if (!$t = array_search($e, $boucle->from)) {
359
+                $k = $j['key']['PRIMARY KEY'];
360
+                if (strpos($k, ',')) {
361
+                    $l = (preg_split('/\s*,\s*/', $k));
362
+                    $k = $desc['key']['PRIMARY KEY'];
363
+                    if (!in_array($k, $l)) {
364
+                        spip_log("jointure impossible $e " . join(',', $l));
365
+
366
+                        return ['', ''];
367
+                    }
368
+                }
369
+                $k = [$boucle->id_table, [$e], $k];
370
+                fabrique_jointures($boucle, [$k]);
371
+                $t = array_search($e, $boucle->from);
372
+            }
373
+        }
374
+    } else {
375
+        $t = $boucle->id_table;
376
+    }
377
+    // demander a SQL de gerer le synonyme
378
+    // ca permet que excep soit dynamique (Cedric, 2/3/06)
379
+    if ($excep != $nom_champ) {
380
+        $excep .= ' AS ' . $nom_champ;
381
+    }
382
+
383
+    return ["$t.$excep", $nom_champ];
384 384
 }
385 385
 
386 386
 /**
@@ -405,7 +405,7 @@  discard block
 block discarded – undo
405 405
  *     Code PHP pour retrouver le champ
406 406
  */
407 407
 function champ_sql($champ, $p, $defaut = null, $remonte_pile = true) {
408
-	return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile);
408
+    return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile);
409 409
 }
410 410
 
411 411
 
@@ -425,9 +425,9 @@  discard block
 block discarded – undo
425 425
  *     Code PHP pour d'exécution de la balise et de ses filtres
426 426
  **/
427 427
 function calculer_champ($p) {
428
-	$p = calculer_balise($p->nom_champ, $p);
428
+    $p = calculer_balise($p->nom_champ, $p);
429 429
 
430
-	return applique_filtres($p);
430
+    return applique_filtres($p);
431 431
 }
432 432
 
433 433
 
@@ -464,26 +464,26 @@  discard block
 block discarded – undo
464 464
  **/
465 465
 function calculer_balise(string $nom, \Champ $p): \Champ {
466 466
 
467
-	// S'agit-t-il d'une balise_XXXX[_dist]() ?
468
-	if ($f = charger_fonction($nom, 'balise', true)) {
469
-		$p->balise_calculee = true;
470
-		$res = $f($p);
471
-		if ($res !== null and is_object($res)) {
472
-			return $res;
473
-		}
474
-	}
475
-
476
-	// Certaines des balises comportant un _ sont generiques
477
-	if ($balise_generique = chercher_balise_generique($nom)) {
478
-		$res = $balise_generique['fonction_generique']($p);
479
-		if ($res !== null and is_object($res)) {
480
-			return $res;
481
-		}
482
-	}
483
-
484
-	$f = charger_fonction('DEFAUT', 'calculer_balise');
485
-
486
-	return $f($nom, $p);
467
+    // S'agit-t-il d'une balise_XXXX[_dist]() ?
468
+    if ($f = charger_fonction($nom, 'balise', true)) {
469
+        $p->balise_calculee = true;
470
+        $res = $f($p);
471
+        if ($res !== null and is_object($res)) {
472
+            return $res;
473
+        }
474
+    }
475
+
476
+    // Certaines des balises comportant un _ sont generiques
477
+    if ($balise_generique = chercher_balise_generique($nom)) {
478
+        $res = $balise_generique['fonction_generique']($p);
479
+        if ($res !== null and is_object($res)) {
480
+            return $res;
481
+        }
482
+    }
483
+
484
+    $f = charger_fonction('DEFAUT', 'calculer_balise');
485
+
486
+    return $f($nom, $p);
487 487
 }
488 488
 
489 489
 
@@ -511,37 +511,37 @@  discard block
 block discarded – undo
511 511
  **/
512 512
 function calculer_balise_DEFAUT_dist($nom, $p) {
513 513
 
514
-	// ca pourrait etre un champ SQL homonyme,
515
-	$p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle);
516
-
517
-	// compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
518
-	// il faut recracher {...} quand ce n'est finalement pas des args
519
-	if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
520
-		$code = addslashes($p->fonctions[0][1]);
521
-		$p->code .= " . '$code'";
522
-	}
523
-
524
-	// ne pas passer le filtre securite sur les id_xxx
525
-	if (strpos($nom, 'ID_') === 0) {
526
-		$p->interdire_scripts = false;
527
-	}
528
-
529
-	// Compatibilite ascendante avec les couleurs html (#FEFEFE) :
530
-	// SI le champ SQL n'est pas trouve
531
-	// ET si la balise a une forme de couleur
532
-	// ET s'il n'y a ni filtre ni etoile
533
-	// ALORS retourner la couleur.
534
-	// Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)]
535
-	if (
536
-		preg_match('/^[A-F]{1,6}$/i', $nom)
537
-		and !$p->etoile
538
-		and !$p->fonctions
539
-	) {
540
-		$p->code = "'#$nom'";
541
-		$p->interdire_scripts = false;
542
-	}
543
-
544
-	return $p;
514
+    // ca pourrait etre un champ SQL homonyme,
515
+    $p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle);
516
+
517
+    // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
518
+    // il faut recracher {...} quand ce n'est finalement pas des args
519
+    if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
520
+        $code = addslashes($p->fonctions[0][1]);
521
+        $p->code .= " . '$code'";
522
+    }
523
+
524
+    // ne pas passer le filtre securite sur les id_xxx
525
+    if (strpos($nom, 'ID_') === 0) {
526
+        $p->interdire_scripts = false;
527
+    }
528
+
529
+    // Compatibilite ascendante avec les couleurs html (#FEFEFE) :
530
+    // SI le champ SQL n'est pas trouve
531
+    // ET si la balise a une forme de couleur
532
+    // ET s'il n'y a ni filtre ni etoile
533
+    // ALORS retourner la couleur.
534
+    // Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)]
535
+    if (
536
+        preg_match('/^[A-F]{1,6}$/i', $nom)
537
+        and !$p->etoile
538
+        and !$p->fonctions
539
+    ) {
540
+        $p->code = "'#$nom'";
541
+        $p->interdire_scripts = false;
542
+    }
543
+
544
+    return $p;
545 545
 }
546 546
 
547 547
 
@@ -584,39 +584,39 @@  discard block
 block discarded – undo
584 584
  **/
585 585
 function calculer_balise_dynamique($p, $nom, $l, $supp = []) {
586 586
 
587
-	if (!balise_distante_interdite($p)) {
588
-		$p->code = "''";
589
-
590
-		return $p;
591
-	}
592
-	// compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
593
-	// il faut recracher {...} quand ce n'est finalement pas des args
594
-	if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
595
-		$p->fonctions = null;
596
-	}
597
-
598
-	if ($p->param and ($c = $p->param[0])) {
599
-		// liste d'arguments commence toujours par la chaine vide
600
-		array_shift($c);
601
-		// construire la liste d'arguments comme pour un filtre
602
-		$param = compose_filtres_args($p, $c, ',');
603
-	} else {
604
-		$param = '';
605
-	}
606
-	$collecte = collecter_balise_dynamique($l, $p, $nom);
607
-
608
-	$p->code = sprintf(
609
-		CODE_EXECUTER_BALISE,
610
-		$nom,
611
-		join(',', $collecte),
612
-		($collecte ? $param : substr($param, 1)), # virer la virgule
613
-		memoriser_contexte_compil($p),
614
-		(!$supp ? '' : (', ' . join(',', $supp)))
615
-	);
616
-
617
-	$p->interdire_scripts = false;
618
-
619
-	return $p;
587
+    if (!balise_distante_interdite($p)) {
588
+        $p->code = "''";
589
+
590
+        return $p;
591
+    }
592
+    // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
593
+    // il faut recracher {...} quand ce n'est finalement pas des args
594
+    if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
595
+        $p->fonctions = null;
596
+    }
597
+
598
+    if ($p->param and ($c = $p->param[0])) {
599
+        // liste d'arguments commence toujours par la chaine vide
600
+        array_shift($c);
601
+        // construire la liste d'arguments comme pour un filtre
602
+        $param = compose_filtres_args($p, $c, ',');
603
+    } else {
604
+        $param = '';
605
+    }
606
+    $collecte = collecter_balise_dynamique($l, $p, $nom);
607
+
608
+    $p->code = sprintf(
609
+        CODE_EXECUTER_BALISE,
610
+        $nom,
611
+        join(',', $collecte),
612
+        ($collecte ? $param : substr($param, 1)), # virer la virgule
613
+        memoriser_contexte_compil($p),
614
+        (!$supp ? '' : (', ' . join(',', $supp)))
615
+    );
616
+
617
+    $p->interdire_scripts = false;
618
+
619
+    return $p;
620 620
 }
621 621
 
622 622
 
@@ -646,17 +646,17 @@  discard block
 block discarded – undo
646 646
  *     Liste des codes PHP d'éxecution des balises collectées
647 647
  **/
648 648
 function collecter_balise_dynamique(array $l, \Champ &$p, string $nom): array {
649
-	$args = [];
650
-	foreach ($l as $c) {
651
-		if ($c === null) {
652
-			$args[] = 'null';
653
-		} else {
654
-			$x = calculer_balise($c, $p);
655
-			$args[] = $x->code;
656
-		}
657
-	}
658
-
659
-	return $args;
649
+    $args = [];
650
+    foreach ($l as $c) {
651
+        if ($c === null) {
652
+            $args[] = 'null';
653
+        } else {
654
+            $x = calculer_balise($c, $p);
655
+            $args[] = $x->code;
656
+        }
657
+    }
658
+
659
+    return $args;
660 660
 }
661 661
 
662 662
 
@@ -671,22 +671,22 @@  discard block
 block discarded – undo
671 671
  *     Nom de la connexion
672 672
  **/
673 673
 function trouver_nom_serveur_distant($p) {
674
-	$nom = $p->id_boucle;
675
-	if (
676
-		$nom
677
-		and isset($p->boucles[$nom])
678
-	) {
679
-		$s = $p->boucles[$nom]->sql_serveur;
680
-		if (
681
-			strlen($s)
682
-			and strlen($serveur = strtolower($s))
683
-			and !in_array($serveur, $GLOBALS['exception_des_connect'])
684
-		) {
685
-			return $serveur;
686
-		}
687
-	}
688
-
689
-	return '';
674
+    $nom = $p->id_boucle;
675
+    if (
676
+        $nom
677
+        and isset($p->boucles[$nom])
678
+    ) {
679
+        $s = $p->boucles[$nom]->sql_serveur;
680
+        if (
681
+            strlen($s)
682
+            and strlen($serveur = strtolower($s))
683
+            and !in_array($serveur, $GLOBALS['exception_des_connect'])
684
+        ) {
685
+            return $serveur;
686
+        }
687
+    }
688
+
689
+    return '';
690 690
 }
691 691
 
692 692
 
@@ -710,15 +710,15 @@  discard block
 block discarded – undo
710 710
  *     - false : La balise est interdite car le serveur est distant
711 711
  **/
712 712
 function balise_distante_interdite($p) {
713
-	$nom = $p->id_boucle;
713
+    $nom = $p->id_boucle;
714 714
 
715
-	if ($nom and trouver_nom_serveur_distant($p)) {
716
-		spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
715
+    if ($nom and trouver_nom_serveur_distant($p)) {
716
+        spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
717 717
 
718
-		return false;
719
-	}
718
+        return false;
719
+    }
720 720
 
721
-	return true;
721
+    return true;
722 722
 }
723 723
 
724 724
 
@@ -728,84 +728,84 @@  discard block
 block discarded – undo
728 728
 //
729 729
 function champs_traitements($p) {
730 730
 
731
-	if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) {
732
-		$ps = $GLOBALS['table_des_traitements'][$p->nom_champ];
733
-	} else {
734
-		// quand on utilise un traitement catch-all *
735
-		// celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer
736
-		// leur propre securite
737
-		if (!$p->balise_calculee) {
738
-			$ps = $GLOBALS['table_des_traitements']['*'];
739
-		} else {
740
-			$ps = false;
741
-		}
742
-	}
743
-
744
-	if (is_array($ps)) {
745
-		// Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte
746
-		$idb = index_boucle($p);
747
-		// si le champ a ete trouve dans une boucle parente sa source est renseignee ici
748
-		if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) {
749
-			$idb = $p->boucles[$idb]->index_champ[$p->nom_champ];
750
-		}
751
-
752
-		// mais on peut aussi etre hors boucle. Se mefier.
753
-		$type_requete = $p->boucles[$idb]->type_requete ?? false;
754
-		$table_sql = $p->boucles[$idb]->show['table_sql'] ?? false;
755
-
756
-		// bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.)
757
-		if ($type_requete and isset($GLOBALS['table_des_tables'][$type_requete])) {
758
-			$type_alias = $type_requete;
759
-			$type_requete = $GLOBALS['table_des_tables'][$type_requete];
760
-		} else {
761
-			$type_alias = false;
762
-		}
763
-
764
-		// le traitement peut n'etre defini que pour une table en particulier "spip_articles"
765
-		if ($table_sql and isset($ps[$table_sql])) {
766
-			$ps = $ps[$table_sql];
767
-		} // ou pour une boucle en particulier "DATA","articles"
768
-		elseif ($type_requete and isset($ps[$type_requete])) {
769
-			$ps = $ps[$type_requete];
770
-		} // ou pour une boucle utilisant un alias ("hierarchie")
771
-		elseif ($type_alias and isset($ps[$type_alias])) {
772
-			$ps = $ps[$type_alias];
773
-		} // ou pour indifféremment quelle que soit la boucle
774
-		elseif (isset($ps[0])) {
775
-			$ps = $ps[0];
776
-		} else {
777
-			$ps = false;
778
-		}
779
-	}
780
-
781
-	if (!$ps) {
782
-		return $p->code;
783
-	}
784
-
785
-	// Si une boucle DOCUMENTS{doublons} est presente dans le squelette,
786
-	// ou si in INCLURE contient {doublons}
787
-	// on insere une fonction de remplissage du tableau des doublons
788
-	// dans les filtres propre() ou typo()
789
-	// (qui traitent les raccourcis <docXX> referencant les docs)
790
-
791
-	if (
792
-		isset($p->descr['documents'])
793
-		and
794
-		$p->descr['documents']
795
-		and (
796
-			(strpos($ps, 'propre') !== false)
797
-			or
798
-			(strpos($ps, 'typo') !== false)
799
-		)
800
-	) {
801
-		$ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
802
-	}
803
-
804
-	// La protection des champs par |safehtml est assuree par les extensions
805
-	// dans la declaration des traitements des champs sensibles
806
-
807
-	// Remplacer enfin le placeholder %s par le vrai code de la balise
808
-	return str_replace('%s', $p->code, $ps);
731
+    if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) {
732
+        $ps = $GLOBALS['table_des_traitements'][$p->nom_champ];
733
+    } else {
734
+        // quand on utilise un traitement catch-all *
735
+        // celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer
736
+        // leur propre securite
737
+        if (!$p->balise_calculee) {
738
+            $ps = $GLOBALS['table_des_traitements']['*'];
739
+        } else {
740
+            $ps = false;
741
+        }
742
+    }
743
+
744
+    if (is_array($ps)) {
745
+        // Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte
746
+        $idb = index_boucle($p);
747
+        // si le champ a ete trouve dans une boucle parente sa source est renseignee ici
748
+        if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) {
749
+            $idb = $p->boucles[$idb]->index_champ[$p->nom_champ];
750
+        }
751
+
752
+        // mais on peut aussi etre hors boucle. Se mefier.
753
+        $type_requete = $p->boucles[$idb]->type_requete ?? false;
754
+        $table_sql = $p->boucles[$idb]->show['table_sql'] ?? false;
755
+
756
+        // bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.)
757
+        if ($type_requete and isset($GLOBALS['table_des_tables'][$type_requete])) {
758
+            $type_alias = $type_requete;
759
+            $type_requete = $GLOBALS['table_des_tables'][$type_requete];
760
+        } else {
761
+            $type_alias = false;
762
+        }
763
+
764
+        // le traitement peut n'etre defini que pour une table en particulier "spip_articles"
765
+        if ($table_sql and isset($ps[$table_sql])) {
766
+            $ps = $ps[$table_sql];
767
+        } // ou pour une boucle en particulier "DATA","articles"
768
+        elseif ($type_requete and isset($ps[$type_requete])) {
769
+            $ps = $ps[$type_requete];
770
+        } // ou pour une boucle utilisant un alias ("hierarchie")
771
+        elseif ($type_alias and isset($ps[$type_alias])) {
772
+            $ps = $ps[$type_alias];
773
+        } // ou pour indifféremment quelle que soit la boucle
774
+        elseif (isset($ps[0])) {
775
+            $ps = $ps[0];
776
+        } else {
777
+            $ps = false;
778
+        }
779
+    }
780
+
781
+    if (!$ps) {
782
+        return $p->code;
783
+    }
784
+
785
+    // Si une boucle DOCUMENTS{doublons} est presente dans le squelette,
786
+    // ou si in INCLURE contient {doublons}
787
+    // on insere une fonction de remplissage du tableau des doublons
788
+    // dans les filtres propre() ou typo()
789
+    // (qui traitent les raccourcis <docXX> referencant les docs)
790
+
791
+    if (
792
+        isset($p->descr['documents'])
793
+        and
794
+        $p->descr['documents']
795
+        and (
796
+            (strpos($ps, 'propre') !== false)
797
+            or
798
+            (strpos($ps, 'typo') !== false)
799
+        )
800
+    ) {
801
+        $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
802
+    }
803
+
804
+    // La protection des champs par |safehtml est assuree par les extensions
805
+    // dans la declaration des traitements des champs sensibles
806
+
807
+    // Remplacer enfin le placeholder %s par le vrai code de la balise
808
+    return str_replace('%s', $p->code, $ps);
809 809
 }
810 810
 
811 811
 
@@ -817,110 +817,110 @@  discard block
 block discarded – undo
817 817
 //
818 818
 function applique_filtres($p) {
819 819
 
820
-	// Traitements standards (cf. supra)
821
-	if ($p->etoile == '') {
822
-		$code = champs_traitements($p);
823
-	} else {
824
-		$code = $p->code;
825
-	}
820
+    // Traitements standards (cf. supra)
821
+    if ($p->etoile == '') {
822
+        $code = champs_traitements($p);
823
+    } else {
824
+        $code = $p->code;
825
+    }
826 826
 
827
-	// Appliquer les filtres perso
828
-	if ($p->param) {
829
-		$code = compose_filtres($p, $code);
830
-	}
827
+    // Appliquer les filtres perso
828
+    if ($p->param) {
829
+        $code = compose_filtres($p, $code);
830
+    }
831 831
 
832
-	// S'il y a un lien avec la session, ajouter un code qui levera
833
-	// un drapeau dans la structure d'invalidation $Cache
834
-	if (isset($p->descr['session'])) {
835
-		$code = "invalideur_session(\$Cache, $code)";
836
-	}
832
+    // S'il y a un lien avec la session, ajouter un code qui levera
833
+    // un drapeau dans la structure d'invalidation $Cache
834
+    if (isset($p->descr['session'])) {
835
+        $code = "invalideur_session(\$Cache, $code)";
836
+    }
837 837
 
838
-	$code = sandbox_composer_interdire_scripts($code, $p);
838
+    $code = sandbox_composer_interdire_scripts($code, $p);
839 839
 
840
-	return $code;
840
+    return $code;
841 841
 }
842 842
 
843 843
 // Cf. function pipeline dans ecrire/inc_utils.php
844 844
 function compose_filtres(&$p, $code) {
845 845
 
846
-	$image_miette = false;
847
-	foreach ($p->param as $filtre) {
848
-		$fonc = array_shift($filtre);
849
-		if (!$fonc) {
850
-			continue;
851
-		} // normalement qu'au premier tour.
852
-		$is_filtre_image = ((substr($fonc, 0, 6) == 'image_') and $fonc != 'image_graver');
853
-		if ($image_miette and !$is_filtre_image) {
854
-			// il faut graver maintenant car apres le filtre en cours
855
-			// on est pas sur d'avoir encore le nom du fichier dans le pipe
856
-			$code = "filtrer('image_graver', $code)";
857
-			$image_miette = false;
858
-		}
859
-
860
-		// recuperer les arguments du filtre,
861
-		// a separer par "," ou ":" dans le cas du filtre "?{a,b}"
862
-		$countfiltre = is_countable($filtre) ? count($filtre) : 0;
863
-		if ($fonc !== '?') {
864
-			$sep = ',';
865
-		} else {
866
-			$sep = ':';
867
-			// |?{a,b} *doit* avoir exactement 2 arguments ; on les force
868
-			if ($countfiltre != 2) {
869
-				$filtre = [$filtre[0] ?? '', $filtre[1] ?? ''];
870
-				$countfiltre = 2;
871
-			}
872
-		}
873
-		$arglist = compose_filtres_args($p, $filtre, $sep);
874
-		$logique = filtre_logique($fonc, $code, substr($arglist, 1));
875
-		if ($logique) {
876
-			$code = $logique;
877
-		} else {
878
-			$code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre);
879
-			if ($is_filtre_image) {
880
-				$image_miette = true;
881
-			}
882
-		}
883
-	}
884
-	// ramasser les images intermediaires inutiles et graver l'image finale
885
-	if ($image_miette) {
886
-		$code = "filtrer('image_graver',$code)";
887
-	}
888
-
889
-	return $code;
846
+    $image_miette = false;
847
+    foreach ($p->param as $filtre) {
848
+        $fonc = array_shift($filtre);
849
+        if (!$fonc) {
850
+            continue;
851
+        } // normalement qu'au premier tour.
852
+        $is_filtre_image = ((substr($fonc, 0, 6) == 'image_') and $fonc != 'image_graver');
853
+        if ($image_miette and !$is_filtre_image) {
854
+            // il faut graver maintenant car apres le filtre en cours
855
+            // on est pas sur d'avoir encore le nom du fichier dans le pipe
856
+            $code = "filtrer('image_graver', $code)";
857
+            $image_miette = false;
858
+        }
859
+
860
+        // recuperer les arguments du filtre,
861
+        // a separer par "," ou ":" dans le cas du filtre "?{a,b}"
862
+        $countfiltre = is_countable($filtre) ? count($filtre) : 0;
863
+        if ($fonc !== '?') {
864
+            $sep = ',';
865
+        } else {
866
+            $sep = ':';
867
+            // |?{a,b} *doit* avoir exactement 2 arguments ; on les force
868
+            if ($countfiltre != 2) {
869
+                $filtre = [$filtre[0] ?? '', $filtre[1] ?? ''];
870
+                $countfiltre = 2;
871
+            }
872
+        }
873
+        $arglist = compose_filtres_args($p, $filtre, $sep);
874
+        $logique = filtre_logique($fonc, $code, substr($arglist, 1));
875
+        if ($logique) {
876
+            $code = $logique;
877
+        } else {
878
+            $code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre);
879
+            if ($is_filtre_image) {
880
+                $image_miette = true;
881
+            }
882
+        }
883
+    }
884
+    // ramasser les images intermediaires inutiles et graver l'image finale
885
+    if ($image_miette) {
886
+        $code = "filtrer('image_graver',$code)";
887
+    }
888
+
889
+    return $code;
890 890
 }
891 891
 
892 892
 // Filtres et,ou,oui,non,sinon,xou,xor,and,or,not,yes
893 893
 // et comparateurs
894 894
 function filtre_logique($fonc, $code, $arg) {
895 895
 
896
-	switch (true) {
897
-		case in_array($fonc, $GLOBALS['table_criteres_infixes']):
898
-			return "($code $fonc $arg)";
899
-		case ($fonc == 'and') or ($fonc == 'et'):
900
-			return "((($code) AND ($arg)) ?' ' :'')";
901
-		case ($fonc == 'or') or ($fonc == 'ou'):
902
-			return "((($code) OR ($arg)) ?' ' :'')";
903
-		case ($fonc == 'xor') or ($fonc == 'xou'):
904
-			return "((($code) XOR ($arg)) ?' ' :'')";
905
-		case ($fonc == 'sinon'):
906
-			return "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)";
907
-		case ($fonc == 'not') or ($fonc == 'non'):
908
-			return "(($code) ?'' :' ')";
909
-		case ($fonc == 'yes') or ($fonc == 'oui'):
910
-			return "(($code) ?' ' :'')";
911
-	}
912
-
913
-	return '';
896
+    switch (true) {
897
+        case in_array($fonc, $GLOBALS['table_criteres_infixes']):
898
+            return "($code $fonc $arg)";
899
+        case ($fonc == 'and') or ($fonc == 'et'):
900
+            return "((($code) AND ($arg)) ?' ' :'')";
901
+        case ($fonc == 'or') or ($fonc == 'ou'):
902
+            return "((($code) OR ($arg)) ?' ' :'')";
903
+        case ($fonc == 'xor') or ($fonc == 'xou'):
904
+            return "((($code) XOR ($arg)) ?' ' :'')";
905
+        case ($fonc == 'sinon'):
906
+            return "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)";
907
+        case ($fonc == 'not') or ($fonc == 'non'):
908
+            return "(($code) ?'' :' ')";
909
+        case ($fonc == 'yes') or ($fonc == 'oui'):
910
+            return "(($code) ?' ' :'')";
911
+    }
912
+
913
+    return '';
914 914
 }
915 915
 
916 916
 function compose_filtres_args($p, $args, $sep) {
917
-	$arglist = '';
918
-	foreach ($args as $arg) {
919
-		$arglist .= $sep .
920
-			calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
921
-	}
917
+    $arglist = '';
918
+    foreach ($args as $arg) {
919
+        $arglist .= $sep .
920
+            calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
921
+    }
922 922
 
923
-	return $arglist;
923
+    return $arglist;
924 924
 }
925 925
 
926 926
 
@@ -938,15 +938,15 @@  discard block
 block discarded – undo
938 938
  **/
939 939
 function calculer_argument_precedent($idb, $nom_champ, &$boucles, $defaut = null) {
940 940
 
941
-	// si recursif, forcer l'extraction du champ SQL mais ignorer le code
942
-	if ($boucles[$idb]->externe) {
943
-		index_pile($idb, $nom_champ, $boucles, '', $defaut);
944
-		// retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle
945
-		// on ignore le defaut fourni dans ce cas
946
-		$defaut = "(\$Pile[\$SP]['$nom_champ'] ?? null)";
947
-	}
941
+    // si recursif, forcer l'extraction du champ SQL mais ignorer le code
942
+    if ($boucles[$idb]->externe) {
943
+        index_pile($idb, $nom_champ, $boucles, '', $defaut);
944
+        // retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle
945
+        // on ignore le defaut fourni dans ce cas
946
+        $defaut = "(\$Pile[\$SP]['$nom_champ'] ?? null)";
947
+    }
948 948
 
949
-	return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut);
949
+    return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut);
950 950
 }
951 951
 
952 952
 //
@@ -960,30 +960,30 @@  discard block
 block discarded – undo
960 960
 //
961 961
 
962 962
 function rindex_pile($p, $champ, $motif) {
963
-	$n = 0;
964
-	$b = $p->id_boucle;
965
-	$p->code = '';
966
-	while ($b != '') {
967
-		foreach ($p->boucles[$b]->criteres as $critere) {
968
-			if ($critere->op == $motif) {
969
-				$p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") .
970
-					"]['$champ']";
971
-				$b = '';
972
-				break 2;
973
-			}
974
-		}
975
-		$n++;
976
-		$b = $p->boucles[$b]->id_parent;
977
-	}
978
-
979
-	// si on est hors d'une boucle de {recherche}, cette balise est vide
980
-	if (!$p->code) {
981
-		$p->code = "''";
982
-	}
983
-
984
-	$p->interdire_scripts = false;
985
-
986
-	return $p;
963
+    $n = 0;
964
+    $b = $p->id_boucle;
965
+    $p->code = '';
966
+    while ($b != '') {
967
+        foreach ($p->boucles[$b]->criteres as $critere) {
968
+            if ($critere->op == $motif) {
969
+                $p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") .
970
+                    "]['$champ']";
971
+                $b = '';
972
+                break 2;
973
+            }
974
+        }
975
+        $n++;
976
+        $b = $p->boucles[$b]->id_parent;
977
+    }
978
+
979
+    // si on est hors d'une boucle de {recherche}, cette balise est vide
980
+    if (!$p->code) {
981
+        $p->code = "''";
982
+    }
983
+
984
+    $p->interdire_scripts = false;
985
+
986
+    return $p;
987 987
 }
988 988
 
989 989
 /**
@@ -993,7 +993,7 @@  discard block
 block discarded – undo
993 993
  * @return string Nom de la balise, avec indication de boucle explicite si présent.
994 994
  */
995 995
 function zbug_presenter_champ($p, $champ = '') {
996
-	$balise = $champ ?: $p->nom_champ;
997
-	$explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
998
-	return "#{$explicite}{$balise}";
996
+    $balise = $champ ?: $p->nom_champ;
997
+    $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
998
+    return "#{$explicite}{$balise}";
999 999
 }
Please login to merge, or discard this patch.
ecrire/public/tracer.php 1 patch
Indentation   +170 added lines, -170 removed lines patch added patch discarded remove patch
@@ -11,187 +11,187 @@
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 function trace_query_start() {
18
-	static $trace = '?';
19
-	if ($trace === '?' or defined('_DEBUG_TRACE_QUERIES')) {
20
-		if (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES) {
21
-			$trace = true;
22
-		}
23
-		else {
24
-			if (empty($GLOBALS['visiteur_session'])) {
25
-				// si un anonyme fait un var_profile on est oblige de remplir le tableau des temps en attendant de savoir
26
-				// car ici on ne sait pas si c'est un hit anonyme
27
-				// ou une requete SQL faite avant chargement de la session
28
-				$trace = (!empty($_GET['var_profile']) ? '?' : false);
29
-			}
30
-			else {
31
-				include_spip('inc/autoriser');
32
-				// gare au bouclage sur calcul de droits au premier appel
33
-				// A fortiori quand on demande une trace
34
-				$trace = false; // on ne trace pas la requete provoquee par autoriser('debug')
35
-				$trace = (!empty($_GET['var_profile']) and autoriser('debug'));
36
-			}
37
-		}
38
-	}
39
-
40
-	return $trace ? microtime() : 0;
18
+    static $trace = '?';
19
+    if ($trace === '?' or defined('_DEBUG_TRACE_QUERIES')) {
20
+        if (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES) {
21
+            $trace = true;
22
+        }
23
+        else {
24
+            if (empty($GLOBALS['visiteur_session'])) {
25
+                // si un anonyme fait un var_profile on est oblige de remplir le tableau des temps en attendant de savoir
26
+                // car ici on ne sait pas si c'est un hit anonyme
27
+                // ou une requete SQL faite avant chargement de la session
28
+                $trace = (!empty($_GET['var_profile']) ? '?' : false);
29
+            }
30
+            else {
31
+                include_spip('inc/autoriser');
32
+                // gare au bouclage sur calcul de droits au premier appel
33
+                // A fortiori quand on demande une trace
34
+                $trace = false; // on ne trace pas la requete provoquee par autoriser('debug')
35
+                $trace = (!empty($_GET['var_profile']) and autoriser('debug'));
36
+            }
37
+        }
38
+    }
39
+
40
+    return $trace ? microtime() : 0;
41 41
 }
42 42
 
43 43
 function trace_query_end($query, $start, $result, $erreur, $serveur = '') {
44
-	static $trace = '?';
45
-	if ($trace === '?') {
46
-		if (empty($GLOBALS['visiteur_session'])) {
47
-			// si un anonyme fait un var_profile on est oblige de remplir le tableau des temps en attendant de savoir
48
-			// car ici on ne sait pas si c'est un hit anonyme
49
-			// ou une requete SQL faite avant chargement de la session
50
-			$trace = (!empty($_GET['var_profile']) ? '?' : false);
51
-		}
52
-		else {
53
-			include_spip('inc/autoriser');
54
-			// gare au bouclage sur calcul de droits au premier appel
55
-			// A fortiori quand on demande une trace
56
-			$trace = false; // on ne trace pas la requete provoquee par autoriser('debug')
57
-			$trace = (!empty($_GET['var_profile']) and autoriser('debug'));
58
-		}
59
-	}
60
-	if ($start) {
61
-		$end = microtime();
62
-		[$usec, $sec] = explode(' ', $start);
63
-		[$usec2, $sec2] = explode(' ', $end);
64
-		$dt = $sec2 + $usec2 - $sec - $usec;
65
-		pipeline('trig_trace_query', ['query' => $query, 'start' => $start, 'end' => $end, 'time' => $dt, 'result' => $result, 'erreur' => $erreur, 'serveur' => $serveur]);
66
-		if ($trace) {
67
-			trace_query_chrono($dt, $query, $result, $serveur);
68
-		}
69
-	}
70
-	// tracer les erreurs, sauf pour select, c'est fait dans abstract_sql
71
-	if ($trace and $erreur and !preg_match('/^select\b/i', $query)) {
72
-		erreur_squelette([sql_errno($serveur), $erreur, $query]);
73
-	}
74
-
75
-	return $result;
44
+    static $trace = '?';
45
+    if ($trace === '?') {
46
+        if (empty($GLOBALS['visiteur_session'])) {
47
+            // si un anonyme fait un var_profile on est oblige de remplir le tableau des temps en attendant de savoir
48
+            // car ici on ne sait pas si c'est un hit anonyme
49
+            // ou une requete SQL faite avant chargement de la session
50
+            $trace = (!empty($_GET['var_profile']) ? '?' : false);
51
+        }
52
+        else {
53
+            include_spip('inc/autoriser');
54
+            // gare au bouclage sur calcul de droits au premier appel
55
+            // A fortiori quand on demande une trace
56
+            $trace = false; // on ne trace pas la requete provoquee par autoriser('debug')
57
+            $trace = (!empty($_GET['var_profile']) and autoriser('debug'));
58
+        }
59
+    }
60
+    if ($start) {
61
+        $end = microtime();
62
+        [$usec, $sec] = explode(' ', $start);
63
+        [$usec2, $sec2] = explode(' ', $end);
64
+        $dt = $sec2 + $usec2 - $sec - $usec;
65
+        pipeline('trig_trace_query', ['query' => $query, 'start' => $start, 'end' => $end, 'time' => $dt, 'result' => $result, 'erreur' => $erreur, 'serveur' => $serveur]);
66
+        if ($trace) {
67
+            trace_query_chrono($dt, $query, $result, $serveur);
68
+        }
69
+    }
70
+    // tracer les erreurs, sauf pour select, c'est fait dans abstract_sql
71
+    if ($trace and $erreur and !preg_match('/^select\b/i', $query)) {
72
+        erreur_squelette([sql_errno($serveur), $erreur, $query]);
73
+    }
74
+
75
+    return $result;
76 76
 }
77 77
 
78 78
 function trace_query_chrono($dt, $query, $result, $serveur = '') {
79
-	include_spip('inc/filtres_mini');
80
-	static $tt = 0, $nb = 0;
81
-
82
-	$x = _request('var_mode_objet');
83
-	if (isset($GLOBALS['debug']['aucasou'])) {
84
-		[, $boucle, $serveur, $contexte] = $GLOBALS['debug']['aucasou'];
85
-		if ($x and !preg_match("/$boucle\$/", $x)) {
86
-			return;
87
-		}
88
-		if ($serveur) {
89
-			$boucle .= " ($serveur)";
90
-		}
91
-		$boucle = "<b>$boucle</b>";
92
-	} else {
93
-		if ($x) {
94
-			return;
95
-		}
96
-		$boucle = $contexte = '';
97
-	}
98
-
99
-	$tt += $dt;
100
-	$nb++;
101
-
102
-	$q = preg_replace('/([a-z)`])\s+([A-Z])/', "$1\n<br />$2", spip_htmlentities($query));
103
-	$e = sql_explain($query, $serveur);
104
-	$r = str_replace('Resource id ', '', (is_object($result) ? get_class($result) : $result));
105
-	$GLOBALS['tableau_des_temps'][] = [$dt, $nb, $boucle, $q, $e, $r, $contexte];
79
+    include_spip('inc/filtres_mini');
80
+    static $tt = 0, $nb = 0;
81
+
82
+    $x = _request('var_mode_objet');
83
+    if (isset($GLOBALS['debug']['aucasou'])) {
84
+        [, $boucle, $serveur, $contexte] = $GLOBALS['debug']['aucasou'];
85
+        if ($x and !preg_match("/$boucle\$/", $x)) {
86
+            return;
87
+        }
88
+        if ($serveur) {
89
+            $boucle .= " ($serveur)";
90
+        }
91
+        $boucle = "<b>$boucle</b>";
92
+    } else {
93
+        if ($x) {
94
+            return;
95
+        }
96
+        $boucle = $contexte = '';
97
+    }
98
+
99
+    $tt += $dt;
100
+    $nb++;
101
+
102
+    $q = preg_replace('/([a-z)`])\s+([A-Z])/', "$1\n<br />$2", spip_htmlentities($query));
103
+    $e = sql_explain($query, $serveur);
104
+    $r = str_replace('Resource id ', '', (is_object($result) ? get_class($result) : $result));
105
+    $GLOBALS['tableau_des_temps'][] = [$dt, $nb, $boucle, $q, $e, $r, $contexte];
106 106
 }
107 107
 
108 108
 
109 109
 function chrono_requete($temps) {
110
-	$total = 0;
111
-	$hors = '<i>' . _T('zbug_hors_compilation') . '</i>';
112
-	$t = $q = $n = $d = [];
113
-	// Totaliser les temps et completer le Explain
114
-	foreach ($temps as $key => $v) {
115
-		[$dt, $nb, $boucle, $query, $explain, $res, $contexte] = $v;
116
-		if (is_array($contexte)) {
117
-			$k = ($contexte[0] . " $boucle");
118
-			include_spip('public/compiler');
119
-			$env = reconstruire_contexte_compil($contexte);
120
-		} else {
121
-			$k = $env = $boucle;
122
-		}
123
-
124
-		$total += $dt;
125
-		$t[$key] = $dt;
126
-		$q[$key] = $nb;
127
-		if (!isset($d[$k])) {
128
-			$d[$k] = 0;
129
-			$n[$k] = 0;
130
-		}
131
-		$d[$k] += $dt;
132
-		++$n[$k];
133
-
134
-		if (!is_array($explain)) {
135
-			$explain = [];
136
-		}
137
-		foreach ($explain as $j => $v) {
138
-			$explain[$j] = "<tr><th>$j</th><td>"
139
-				. str_replace(';', '<br />', $v)
140
-				. '</td></tr>';
141
-		}
142
-		$e = "<table class='explain'>"
143
-			. '<caption>'
144
-			. $query
145
-			. '</caption>'
146
-			. "<tr><th>Time</th><td>$dt</td></tr>"
147
-			. "<tr><th>Order</th><td>$nb</td></tr>"
148
-			. "<tr><th>Res</th><td>$res</td></tr>"
149
-			. join('', $explain)
150
-			. '</table>';
151
-
152
-		$temps[$key] = [$e, $env, $k];
153
-	}
154
-	// Trier par temps d'execution decroissant
155
-	array_multisort($t, SORT_DESC, $q, $temps);
156
-	arsort($d);
157
-	$i = 1;
158
-	$t = [];
159
-	// Fabriquer les liens de navigations dans le tableau des temps
160
-	foreach ($temps as $k => $v) {
161
-		$titre = strip_tags($v[2]);
162
-		$href = quote_amp($GLOBALS['REQUEST_URI']) . "#req$i";
163
-		$href = str_replace("\\'", '&#39;', $href);
164
-
165
-		if (!isset($t[$v[2]])) {
166
-			$t[$v[2]] = [];
167
-		}
168
-		$t[$v[2]][] = "<span class='spip-debug-arg'> "
169
-			. "<a title='$titre' href='$href'>$i</a>"
170
-			. '</span>'
171
-			. ((count($t[$v[2]]) % 10 == 9) ? '<br />' : '');
172
-		$i++;
173
-	}
174
-
175
-	if ($d['']) {
176
-		$d[$hors] = $d[''];
177
-		$n[$hors] = $n[''];
178
-		$t[$hors] = $t[''];
179
-	}
180
-	unset($d['']);
181
-	// Fabriquer le tableau des liens de navigation dans le grand tableau
182
-	foreach ($d as $k => $v) {
183
-		$d[$k] = $n[$k] . "</td><td>$k</td><td class='time'>$v</td><td class='liste-reqs'>"
184
-			. join('', $t[$k]);
185
-	}
186
-
187
-	$navigation = [
188
-		_T('zbug_statistiques'),
189
-		'<tr><td>'
190
-		. join("</td></tr>\n<tr><td>", $d)
191
-		. "</td></tr>\n"
192
-		. (# _request('var_mode_objet') ? '' :
193
-		('<tr><td>' . (is_countable($temps) ? count($temps) : 0) . '</td><td>' . _T('info_total') . '</td><td class="time">' . $total . '</td><td></td></tr>'))
194
-	];
195
-
196
-	return [$temps, $navigation];
110
+    $total = 0;
111
+    $hors = '<i>' . _T('zbug_hors_compilation') . '</i>';
112
+    $t = $q = $n = $d = [];
113
+    // Totaliser les temps et completer le Explain
114
+    foreach ($temps as $key => $v) {
115
+        [$dt, $nb, $boucle, $query, $explain, $res, $contexte] = $v;
116
+        if (is_array($contexte)) {
117
+            $k = ($contexte[0] . " $boucle");
118
+            include_spip('public/compiler');
119
+            $env = reconstruire_contexte_compil($contexte);
120
+        } else {
121
+            $k = $env = $boucle;
122
+        }
123
+
124
+        $total += $dt;
125
+        $t[$key] = $dt;
126
+        $q[$key] = $nb;
127
+        if (!isset($d[$k])) {
128
+            $d[$k] = 0;
129
+            $n[$k] = 0;
130
+        }
131
+        $d[$k] += $dt;
132
+        ++$n[$k];
133
+
134
+        if (!is_array($explain)) {
135
+            $explain = [];
136
+        }
137
+        foreach ($explain as $j => $v) {
138
+            $explain[$j] = "<tr><th>$j</th><td>"
139
+                . str_replace(';', '<br />', $v)
140
+                . '</td></tr>';
141
+        }
142
+        $e = "<table class='explain'>"
143
+            . '<caption>'
144
+            . $query
145
+            . '</caption>'
146
+            . "<tr><th>Time</th><td>$dt</td></tr>"
147
+            . "<tr><th>Order</th><td>$nb</td></tr>"
148
+            . "<tr><th>Res</th><td>$res</td></tr>"
149
+            . join('', $explain)
150
+            . '</table>';
151
+
152
+        $temps[$key] = [$e, $env, $k];
153
+    }
154
+    // Trier par temps d'execution decroissant
155
+    array_multisort($t, SORT_DESC, $q, $temps);
156
+    arsort($d);
157
+    $i = 1;
158
+    $t = [];
159
+    // Fabriquer les liens de navigations dans le tableau des temps
160
+    foreach ($temps as $k => $v) {
161
+        $titre = strip_tags($v[2]);
162
+        $href = quote_amp($GLOBALS['REQUEST_URI']) . "#req$i";
163
+        $href = str_replace("\\'", '&#39;', $href);
164
+
165
+        if (!isset($t[$v[2]])) {
166
+            $t[$v[2]] = [];
167
+        }
168
+        $t[$v[2]][] = "<span class='spip-debug-arg'> "
169
+            . "<a title='$titre' href='$href'>$i</a>"
170
+            . '</span>'
171
+            . ((count($t[$v[2]]) % 10 == 9) ? '<br />' : '');
172
+        $i++;
173
+    }
174
+
175
+    if ($d['']) {
176
+        $d[$hors] = $d[''];
177
+        $n[$hors] = $n[''];
178
+        $t[$hors] = $t[''];
179
+    }
180
+    unset($d['']);
181
+    // Fabriquer le tableau des liens de navigation dans le grand tableau
182
+    foreach ($d as $k => $v) {
183
+        $d[$k] = $n[$k] . "</td><td>$k</td><td class='time'>$v</td><td class='liste-reqs'>"
184
+            . join('', $t[$k]);
185
+    }
186
+
187
+    $navigation = [
188
+        _T('zbug_statistiques'),
189
+        '<tr><td>'
190
+        . join("</td></tr>\n<tr><td>", $d)
191
+        . "</td></tr>\n"
192
+        . (# _request('var_mode_objet') ? '' :
193
+        ('<tr><td>' . (is_countable($temps) ? count($temps) : 0) . '</td><td>' . _T('info_total') . '</td><td class="time">' . $total . '</td><td></td></tr>'))
194
+    ];
195
+
196
+    return [$temps, $navigation];
197 197
 }
Please login to merge, or discard this patch.
ecrire/public/phraser_html.php 1 patch
Indentation   +1032 added lines, -1032 removed lines patch added patch discarded remove patch
@@ -20,7 +20,7 @@  discard block
 block discarded – undo
20 20
  **/
21 21
 
22 22
 if (!defined('_ECRIRE_INC_VERSION')) {
23
-	return;
23
+    return;
24 24
 }
25 25
 
26 26
 /** Début de la partie principale d'une boucle */
@@ -64,82 +64,82 @@  discard block
 block discarded – undo
64 64
 
65 65
 function phraser_inclure($texte, $ligne, $result) {
66 66
 
67
-	while (preg_match(BALISE_INCLURE, $texte, $match)) {
68
-		$match = array_pad($match, 3, null);
69
-		$p = strpos($texte, (string) $match[0]);
70
-		$debut = substr($texte, 0, $p);
71
-		if ($p) {
72
-			$result = phraser_idiomes($debut, $ligne, $result);
73
-		}
74
-		$ligne += substr_count($debut, "\n");
75
-		$champ = new Inclure();
76
-		$champ->ligne = $ligne;
77
-		$ligne += substr_count($match[0], "\n");
78
-		$fichier = $match[2];
79
-		# assurer ici la migration .php3 => .php
80
-		# et de l'ancienne syntaxe INCLURE(page.php3) devenue surperflue
81
-		if ($fichier and preg_match(',^(.*[.]php)3$,', $fichier, $r)) {
82
-			$fichier = $r[1];
83
-		}
84
-		$champ->texte = ($fichier !== 'page.php') ? $fichier : '';
85
-		$texte = substr($texte, $p + strlen($match[0]));
86
-		// on assimile {var=val} a une liste de un argument sans fonction
87
-		$pos_apres = 0;
88
-		phraser_args($texte, '/>', '', $result, $champ, $pos_apres);
89
-		if (!$champ->texte or (is_countable($champ->param) ? count($champ->param) : 0) > 1) {
90
-			if (!function_exists('normaliser_inclure')) {
91
-				include_spip('public/normaliser');
92
-			}
93
-			normaliser_inclure($champ);
94
-		}
95
-		$texte = substr($texte, strpos($texte, '>', $pos_apres) + 1);
96
-		$texte = preg_replace(',^</INCLU[DR]E>,', '', $texte);
97
-		$result[] = $champ;
98
-	}
99
-
100
-	return (($texte === '') ? $result : phraser_idiomes($texte, $ligne, $result));
67
+    while (preg_match(BALISE_INCLURE, $texte, $match)) {
68
+        $match = array_pad($match, 3, null);
69
+        $p = strpos($texte, (string) $match[0]);
70
+        $debut = substr($texte, 0, $p);
71
+        if ($p) {
72
+            $result = phraser_idiomes($debut, $ligne, $result);
73
+        }
74
+        $ligne += substr_count($debut, "\n");
75
+        $champ = new Inclure();
76
+        $champ->ligne = $ligne;
77
+        $ligne += substr_count($match[0], "\n");
78
+        $fichier = $match[2];
79
+        # assurer ici la migration .php3 => .php
80
+        # et de l'ancienne syntaxe INCLURE(page.php3) devenue surperflue
81
+        if ($fichier and preg_match(',^(.*[.]php)3$,', $fichier, $r)) {
82
+            $fichier = $r[1];
83
+        }
84
+        $champ->texte = ($fichier !== 'page.php') ? $fichier : '';
85
+        $texte = substr($texte, $p + strlen($match[0]));
86
+        // on assimile {var=val} a une liste de un argument sans fonction
87
+        $pos_apres = 0;
88
+        phraser_args($texte, '/>', '', $result, $champ, $pos_apres);
89
+        if (!$champ->texte or (is_countable($champ->param) ? count($champ->param) : 0) > 1) {
90
+            if (!function_exists('normaliser_inclure')) {
91
+                include_spip('public/normaliser');
92
+            }
93
+            normaliser_inclure($champ);
94
+        }
95
+        $texte = substr($texte, strpos($texte, '>', $pos_apres) + 1);
96
+        $texte = preg_replace(',^</INCLU[DR]E>,', '', $texte);
97
+        $result[] = $champ;
98
+    }
99
+
100
+    return (($texte === '') ? $result : phraser_idiomes($texte, $ligne, $result));
101 101
 }
102 102
 
103 103
 function phraser_polyglotte($texte, $ligne, $result) {
104 104
 
105
-	if (preg_match_all(BALISE_POLYGLOTTE, $texte, $m, PREG_SET_ORDER)) {
106
-		foreach ($m as $match) {
107
-			$p = strpos($texte, (string) $match[0]);
108
-			$debut = substr($texte, 0, $p);
109
-			if ($p) {
110
-				$champ = new Texte();
111
-				$champ->texte = $debut;
112
-				$champ->ligne = $ligne;
113
-				$result[] = $champ;
114
-				$ligne += substr_count($champ->texte, "\n");
115
-			}
116
-
117
-			$champ = new Polyglotte();
118
-			$champ->ligne = $ligne;
119
-			$ligne += substr_count($match[0], "\n");
120
-			$lang = '';
121
-			$bloc = $match[1];
122
-			$texte = substr($texte, $p + strlen($match[0]));
123
-			while (preg_match('/^[[:space:]]*([^[{]*)[[:space:]]*[[{]([a-z_]+)[]}](.*)$/si', $bloc, $regs)) {
124
-				$trad = $regs[1];
125
-				if ($trad or $lang) {
126
-					$champ->traductions[$lang] = $trad;
127
-				}
128
-				$lang = $regs[2];
129
-				$bloc = $regs[3];
130
-			}
131
-			$champ->traductions[$lang] = $bloc;
132
-			$result[] = $champ;
133
-		}
134
-	}
135
-	if ($texte !== '') {
136
-		$champ = new Texte();
137
-		$champ->texte = $texte;
138
-		$champ->ligne = $ligne;
139
-		$result[] = $champ;
140
-	}
141
-
142
-	return $result;
105
+    if (preg_match_all(BALISE_POLYGLOTTE, $texte, $m, PREG_SET_ORDER)) {
106
+        foreach ($m as $match) {
107
+            $p = strpos($texte, (string) $match[0]);
108
+            $debut = substr($texte, 0, $p);
109
+            if ($p) {
110
+                $champ = new Texte();
111
+                $champ->texte = $debut;
112
+                $champ->ligne = $ligne;
113
+                $result[] = $champ;
114
+                $ligne += substr_count($champ->texte, "\n");
115
+            }
116
+
117
+            $champ = new Polyglotte();
118
+            $champ->ligne = $ligne;
119
+            $ligne += substr_count($match[0], "\n");
120
+            $lang = '';
121
+            $bloc = $match[1];
122
+            $texte = substr($texte, $p + strlen($match[0]));
123
+            while (preg_match('/^[[:space:]]*([^[{]*)[[:space:]]*[[{]([a-z_]+)[]}](.*)$/si', $bloc, $regs)) {
124
+                $trad = $regs[1];
125
+                if ($trad or $lang) {
126
+                    $champ->traductions[$lang] = $trad;
127
+                }
128
+                $lang = $regs[2];
129
+                $bloc = $regs[3];
130
+            }
131
+            $champ->traductions[$lang] = $bloc;
132
+            $result[] = $champ;
133
+        }
134
+    }
135
+    if ($texte !== '') {
136
+        $champ = new Texte();
137
+        $champ->texte = $texte;
138
+        $champ->ligne = $ligne;
139
+        $result[] = $champ;
140
+    }
141
+
142
+    return $result;
143 143
 }
144 144
 
145 145
 
@@ -161,43 +161,43 @@  discard block
 block discarded – undo
161 161
  * @return array
162 162
  **/
163 163
 function phraser_idiomes($texte, $ligne, $result) {
164
-	while (preg_match(BALISE_IDIOMES, $texte, $match)) {
165
-		$match = array_pad($match, 8, null);
166
-		$p = strpos($texte, (string) $match[0]);
167
-		$ko = (!$match[3] && ($match[5][0] !== '='));
168
-		$debut = substr($texte, 0, $p + ($ko ? strlen($match[0]) : 0));
169
-		if ($debut) {
170
-			$result = phraser_champs($debut, $ligne, $result);
171
-		}
172
-		$texte = substr($texte, $p + strlen($match[0]));
173
-		$ligne += substr_count($debut, "\n");
174
-		if ($ko) {
175
-			continue;
176
-		} // faux idiome
177
-		$champ = new Idiome();
178
-		$champ->ligne = $ligne;
179
-		$ligne += substr_count($match[0], "\n");
180
-		// Stocker les arguments de la balise de traduction
181
-		$args = [];
182
-		$largs = $match[5];
183
-		while (preg_match(BALISE_IDIOMES_ARGS, $largs, $r)) {
184
-			$args[$r[1]] = phraser_champs($r[2], 0, []);
185
-			$largs = substr($largs, strlen($r[0]));
186
-		}
187
-		$champ->arg = $args;
188
-		$champ->nom_champ = strtolower($match[3]);
189
-		$champ->module = $match[2];
190
-		// pas d'imbrication pour les filtres sur langue
191
-		$pos_apres = 0;
192
-		phraser_args($match[7] ?? '', ':', '', [], $champ, $pos_apres);
193
-		$champ->apres = substr($match[7] ?? '', $pos_apres);
194
-		$result[] = $champ;
195
-	}
196
-	if ($texte !== '') {
197
-		$result = phraser_champs($texte, $ligne, $result);
198
-	}
199
-
200
-	return $result;
164
+    while (preg_match(BALISE_IDIOMES, $texte, $match)) {
165
+        $match = array_pad($match, 8, null);
166
+        $p = strpos($texte, (string) $match[0]);
167
+        $ko = (!$match[3] && ($match[5][0] !== '='));
168
+        $debut = substr($texte, 0, $p + ($ko ? strlen($match[0]) : 0));
169
+        if ($debut) {
170
+            $result = phraser_champs($debut, $ligne, $result);
171
+        }
172
+        $texte = substr($texte, $p + strlen($match[0]));
173
+        $ligne += substr_count($debut, "\n");
174
+        if ($ko) {
175
+            continue;
176
+        } // faux idiome
177
+        $champ = new Idiome();
178
+        $champ->ligne = $ligne;
179
+        $ligne += substr_count($match[0], "\n");
180
+        // Stocker les arguments de la balise de traduction
181
+        $args = [];
182
+        $largs = $match[5];
183
+        while (preg_match(BALISE_IDIOMES_ARGS, $largs, $r)) {
184
+            $args[$r[1]] = phraser_champs($r[2], 0, []);
185
+            $largs = substr($largs, strlen($r[0]));
186
+        }
187
+        $champ->arg = $args;
188
+        $champ->nom_champ = strtolower($match[3]);
189
+        $champ->module = $match[2];
190
+        // pas d'imbrication pour les filtres sur langue
191
+        $pos_apres = 0;
192
+        phraser_args($match[7] ?? '', ':', '', [], $champ, $pos_apres);
193
+        $champ->apres = substr($match[7] ?? '', $pos_apres);
194
+        $result[] = $champ;
195
+    }
196
+    if ($texte !== '') {
197
+        $result = phraser_champs($texte, $ligne, $result);
198
+    }
199
+
200
+    return $result;
201 201
 }
202 202
 
203 203
 /**
@@ -215,47 +215,47 @@  discard block
 block discarded – undo
215 215
  * @return array
216 216
  **/
217 217
 function phraser_champs($texte, $ligne, $result) {
218
-	while (preg_match('/' . NOM_DE_CHAMP . '/S', $texte, $match)) {
219
-		$p = strpos($texte, (string) $match[0]);
220
-		// texte après la balise
221
-		$suite = substr($texte, $p + strlen($match[0]));
222
-
223
-		$debut = substr($texte, 0, $p);
224
-		if ($p) {
225
-			$result = phraser_polyglotte($debut, $ligne, $result);
226
-		}
227
-		$ligne += substr_count($debut, "\n");
228
-		$champ = new Champ();
229
-		$champ->ligne = $ligne;
230
-		$ligne += substr_count($match[0], "\n");
231
-		$champ->nom_boucle = $match[2];
232
-		$champ->nom_champ = $match[3];
233
-		$champ->etoile = $match[5];
234
-
235
-		if ($suite and $suite[0] == '{') {
236
-			phraser_arg($suite, '', [], $champ);
237
-			// ce ltrim est une ereur de conception
238
-			// mais on le conserve par souci de compatibilite
239
-			$texte = ltrim($suite);
240
-			// Il faudrait le normaliser dans l'arbre de syntaxe abstraite
241
-			// pour faire sauter ce cas particulier a la decompilation.
242
-			/* Ce qui suit est malheureusement incomplet pour cela:
218
+    while (preg_match('/' . NOM_DE_CHAMP . '/S', $texte, $match)) {
219
+        $p = strpos($texte, (string) $match[0]);
220
+        // texte après la balise
221
+        $suite = substr($texte, $p + strlen($match[0]));
222
+
223
+        $debut = substr($texte, 0, $p);
224
+        if ($p) {
225
+            $result = phraser_polyglotte($debut, $ligne, $result);
226
+        }
227
+        $ligne += substr_count($debut, "\n");
228
+        $champ = new Champ();
229
+        $champ->ligne = $ligne;
230
+        $ligne += substr_count($match[0], "\n");
231
+        $champ->nom_boucle = $match[2];
232
+        $champ->nom_champ = $match[3];
233
+        $champ->etoile = $match[5];
234
+
235
+        if ($suite and $suite[0] == '{') {
236
+            phraser_arg($suite, '', [], $champ);
237
+            // ce ltrim est une ereur de conception
238
+            // mais on le conserve par souci de compatibilite
239
+            $texte = ltrim($suite);
240
+            // Il faudrait le normaliser dans l'arbre de syntaxe abstraite
241
+            // pour faire sauter ce cas particulier a la decompilation.
242
+            /* Ce qui suit est malheureusement incomplet pour cela:
243 243
 			if ($n = (strlen($suite) - strlen($texte))) {
244 244
 				$champ->apres = array(new Texte);
245 245
 				$champ->apres[0]->texte = substr($suite,0,$n);
246 246
 			}
247 247
 			*/
248
-		} else {
249
-			$texte = $suite;
250
-		}
251
-		phraser_vieux($champ);
252
-		$result[] = $champ;
253
-	}
254
-	if ($texte !== '') {
255
-		$result = phraser_polyglotte($texte, $ligne, $result);
256
-	}
257
-
258
-	return $result;
248
+        } else {
249
+            $texte = $suite;
250
+        }
251
+        phraser_vieux($champ);
252
+        $result[] = $champ;
253
+    }
254
+    if ($texte !== '') {
255
+        $result = phraser_polyglotte($texte, $ligne, $result);
256
+    }
257
+
258
+    return $result;
259 259
 }
260 260
 
261 261
 // Gestion des imbrications:
@@ -264,15 +264,15 @@  discard block
 block discarded – undo
264 264
 // on recommence tant qu'il y a des [...] en substituant a l'appel suivant
265 265
 
266 266
 function phraser_champs_etendus($texte, $ligne, $result) {
267
-	if ($texte === '') {
268
-		return $result;
269
-	}
270
-	$sep = '##';
271
-	while (strpos($texte, (string) $sep) !== false) {
272
-		$sep .= '#';
273
-	}
274
-
275
-	return array_merge($result, phraser_champs_interieurs($texte, $ligne, $sep, []));
267
+    if ($texte === '') {
268
+        return $result;
269
+    }
270
+    $sep = '##';
271
+    while (strpos($texte, (string) $sep) !== false) {
272
+        $sep .= '#';
273
+    }
274
+
275
+    return array_merge($result, phraser_champs_interieurs($texte, $ligne, $sep, []));
276 276
 }
277 277
 
278 278
 /**
@@ -291,275 +291,275 @@  discard block
 block discarded – undo
291 291
  * @return array
292 292
  */
293 293
 function phraser_args(string $texte, $fin, $sep, $result, &$pointeur_champ, &$pos_debut) {
294
-	$length = strlen($texte);
295
-	while ($pos_debut < $length and trim($texte[$pos_debut]) === '') {
296
-		$pos_debut++;
297
-	}
298
-	while (($pos_debut < $length) && strpos($fin, $texte[$pos_debut]) === false) {
299
-		// phraser_arg modifie directement le $texte, on fait donc avec ici en passant par une sous chaine
300
-		$st = substr($texte, $pos_debut);
301
-		$result = phraser_arg($st, $sep, $result, $pointeur_champ);
302
-		$pos_debut = $length - strlen($st);
303
-		while ($pos_debut < $length and trim($texte[$pos_debut]) === '') {
304
-			$pos_debut++;
305
-		}
306
-	}
307
-
308
-	return $result;
294
+    $length = strlen($texte);
295
+    while ($pos_debut < $length and trim($texte[$pos_debut]) === '') {
296
+        $pos_debut++;
297
+    }
298
+    while (($pos_debut < $length) && strpos($fin, $texte[$pos_debut]) === false) {
299
+        // phraser_arg modifie directement le $texte, on fait donc avec ici en passant par une sous chaine
300
+        $st = substr($texte, $pos_debut);
301
+        $result = phraser_arg($st, $sep, $result, $pointeur_champ);
302
+        $pos_debut = $length - strlen($st);
303
+        while ($pos_debut < $length and trim($texte[$pos_debut]) === '') {
304
+            $pos_debut++;
305
+        }
306
+    }
307
+
308
+    return $result;
309 309
 }
310 310
 
311 311
 function phraser_arg(&$texte, $sep, $result, &$pointeur_champ) {
312
-	preg_match(',^(\|?[^}{)|]*)(.*)$,ms', $texte, $match);
313
-	$suite = ltrim($match[2]);
314
-	$fonc = trim($match[1]);
315
-	if ($fonc && $fonc[0] == '|') {
316
-		$fonc = ltrim(substr($fonc, 1));
317
-	}
318
-	$res = [$fonc];
319
-	$err_f = '';
320
-	// cas du filtre sans argument ou du critere /
321
-	if (($suite && ($suite[0] != '{')) || ($fonc && $fonc[0] == '/')) {
322
-		// si pas d'argument, alors il faut une fonction ou un double |
323
-		if (!$match[1]) {
324
-			$err_f = ['zbug_erreur_filtre', ['filtre' => $texte]];
325
-			erreur_squelette($err_f, $pointeur_champ);
326
-			$texte = '';
327
-		} else {
328
-			$texte = $suite;
329
-		}
330
-		if ($err_f) {
331
-			$pointeur_champ->param = false;
332
-		} elseif ($fonc !== '') {
333
-			$pointeur_champ->param[] = $res;
334
-		}
335
-		// pour les balises avec faux filtres qui boudent ce dur larbeur
336
-		$pointeur_champ->fonctions[] = [$fonc, ''];
337
-
338
-		return $result;
339
-	}
340
-	$args = ltrim(substr($suite, 1)); // virer le '(' initial
341
-	$collecte = [];
342
-	while ($args && $args[0] != '}') {
343
-		if ($args[0] == '"') {
344
-			preg_match('/^(")([^"]*)(")(.*)$/ms', $args, $regs);
345
-		} elseif ($args[0] == "'") {
346
-			preg_match("/^(')([^']*)(')(.*)$/ms", $args, $regs);
347
-		} else {
348
-			preg_match('/^([[:space:]]*)([^,([{}]*([(\[{][^])}]*[])}])?[^,}]*)([,}].*)$/ms', $args, $regs);
349
-			if (!isset($regs[2]) or !strlen($regs[2])) {
350
-				$err_f = ['zbug_erreur_filtre', ['filtre' => $args]];
351
-				erreur_squelette($err_f, $pointeur_champ);
352
-				$champ = new Texte();
353
-				$champ->apres = $champ->avant = $args = '';
354
-				break;
355
-			}
356
-		}
357
-		$arg = $regs[2];
358
-		if (trim($regs[1])) {
359
-			$champ = new Texte();
360
-			$champ->texte = $arg;
361
-			$champ->apres = $champ->avant = $regs[1];
362
-			$result[] = $champ;
363
-			$collecte[] = $champ;
364
-			$args = ltrim($regs[count($regs) - 1]);
365
-		} else {
366
-			if (!preg_match('/' . NOM_DE_CHAMP . '([{|])/', $arg, $r)) {
367
-				// 0 est un aveu d'impuissance. A completer
368
-				$arg = phraser_champs_exterieurs($arg, 0, $sep, $result);
369
-
370
-				$args = ltrim($regs[count($regs) - 1]);
371
-				$collecte = array_merge($collecte, $arg);
372
-				$result = array_merge($result, $arg);
373
-			} else {
374
-				$n = strpos($args, (string) $r[0]);
375
-				$pred = substr($args, 0, $n);
376
-				$par = ',}';
377
-				if (preg_match('/^(.*)\($/', $pred, $m)) {
378
-					$pred = $m[1];
379
-					$par = ')';
380
-				}
381
-				if ($pred) {
382
-					$champ = new Texte();
383
-					$champ->texte = $pred;
384
-					$champ->apres = $champ->avant = '';
385
-					$result[] = $champ;
386
-					$collecte[] = $champ;
387
-				}
388
-				$rec = substr($args, $n + strlen($r[0]) - 1);
389
-				$champ = new Champ();
390
-				$champ->nom_boucle = $r[2];
391
-				$champ->nom_champ = $r[3];
392
-				$champ->etoile = $r[5];
393
-				$next = $r[6];
394
-				while ($next == '{') {
395
-					phraser_arg($rec, $sep, [], $champ);
396
-					$args = ltrim($rec);
397
-					$next = $args[0] ?? '';
398
-				}
399
-				while ($next == '|') {
400
-					$pos_apres = 0;
401
-					phraser_args($rec, $par, $sep, [], $champ, $pos_apres);
402
-					$args = substr($rec, $pos_apres);
403
-					$next = $args[0] ?? '';
404
-				}
405
-				// Si erreur de syntaxe dans un sous-argument, propager.
406
-				if ($champ->param === false) {
407
-					$err_f = true;
408
-				} else {
409
-					phraser_vieux($champ);
410
-				}
411
-				if ($par == ')') {
412
-					$args = substr($args, 1);
413
-				}
414
-				$collecte[] = $champ;
415
-				$result[] = $champ;
416
-			}
417
-		}
418
-		if (isset($args[0]) and $args[0] == ',') {
419
-			$args = ltrim(substr($args, 1));
420
-			if ($collecte) {
421
-				$res[] = $collecte;
422
-				$collecte = [];
423
-			}
424
-		}
425
-	}
426
-	if ($collecte) {
427
-		$res[] = $collecte;
428
-		$collecte = [];
429
-	}
430
-	$texte = substr($args, 1);
431
-	$source = substr($suite, 0, strlen($suite) - strlen($texte));
432
-	// propager les erreurs, et ignorer les param vides
433
-	if ($pointeur_champ->param !== false) {
434
-		if ($err_f) {
435
-			$pointeur_champ->param = false;
436
-		} elseif ($fonc !== '' || count($res) > 1) {
437
-			$pointeur_champ->param[] = $res;
438
-		}
439
-	}
440
-	// pour les balises avec faux filtres qui boudent ce dur larbeur
441
-	$pointeur_champ->fonctions[] = [$fonc, $source];
442
-
443
-	return $result;
312
+    preg_match(',^(\|?[^}{)|]*)(.*)$,ms', $texte, $match);
313
+    $suite = ltrim($match[2]);
314
+    $fonc = trim($match[1]);
315
+    if ($fonc && $fonc[0] == '|') {
316
+        $fonc = ltrim(substr($fonc, 1));
317
+    }
318
+    $res = [$fonc];
319
+    $err_f = '';
320
+    // cas du filtre sans argument ou du critere /
321
+    if (($suite && ($suite[0] != '{')) || ($fonc && $fonc[0] == '/')) {
322
+        // si pas d'argument, alors il faut une fonction ou un double |
323
+        if (!$match[1]) {
324
+            $err_f = ['zbug_erreur_filtre', ['filtre' => $texte]];
325
+            erreur_squelette($err_f, $pointeur_champ);
326
+            $texte = '';
327
+        } else {
328
+            $texte = $suite;
329
+        }
330
+        if ($err_f) {
331
+            $pointeur_champ->param = false;
332
+        } elseif ($fonc !== '') {
333
+            $pointeur_champ->param[] = $res;
334
+        }
335
+        // pour les balises avec faux filtres qui boudent ce dur larbeur
336
+        $pointeur_champ->fonctions[] = [$fonc, ''];
337
+
338
+        return $result;
339
+    }
340
+    $args = ltrim(substr($suite, 1)); // virer le '(' initial
341
+    $collecte = [];
342
+    while ($args && $args[0] != '}') {
343
+        if ($args[0] == '"') {
344
+            preg_match('/^(")([^"]*)(")(.*)$/ms', $args, $regs);
345
+        } elseif ($args[0] == "'") {
346
+            preg_match("/^(')([^']*)(')(.*)$/ms", $args, $regs);
347
+        } else {
348
+            preg_match('/^([[:space:]]*)([^,([{}]*([(\[{][^])}]*[])}])?[^,}]*)([,}].*)$/ms', $args, $regs);
349
+            if (!isset($regs[2]) or !strlen($regs[2])) {
350
+                $err_f = ['zbug_erreur_filtre', ['filtre' => $args]];
351
+                erreur_squelette($err_f, $pointeur_champ);
352
+                $champ = new Texte();
353
+                $champ->apres = $champ->avant = $args = '';
354
+                break;
355
+            }
356
+        }
357
+        $arg = $regs[2];
358
+        if (trim($regs[1])) {
359
+            $champ = new Texte();
360
+            $champ->texte = $arg;
361
+            $champ->apres = $champ->avant = $regs[1];
362
+            $result[] = $champ;
363
+            $collecte[] = $champ;
364
+            $args = ltrim($regs[count($regs) - 1]);
365
+        } else {
366
+            if (!preg_match('/' . NOM_DE_CHAMP . '([{|])/', $arg, $r)) {
367
+                // 0 est un aveu d'impuissance. A completer
368
+                $arg = phraser_champs_exterieurs($arg, 0, $sep, $result);
369
+
370
+                $args = ltrim($regs[count($regs) - 1]);
371
+                $collecte = array_merge($collecte, $arg);
372
+                $result = array_merge($result, $arg);
373
+            } else {
374
+                $n = strpos($args, (string) $r[0]);
375
+                $pred = substr($args, 0, $n);
376
+                $par = ',}';
377
+                if (preg_match('/^(.*)\($/', $pred, $m)) {
378
+                    $pred = $m[1];
379
+                    $par = ')';
380
+                }
381
+                if ($pred) {
382
+                    $champ = new Texte();
383
+                    $champ->texte = $pred;
384
+                    $champ->apres = $champ->avant = '';
385
+                    $result[] = $champ;
386
+                    $collecte[] = $champ;
387
+                }
388
+                $rec = substr($args, $n + strlen($r[0]) - 1);
389
+                $champ = new Champ();
390
+                $champ->nom_boucle = $r[2];
391
+                $champ->nom_champ = $r[3];
392
+                $champ->etoile = $r[5];
393
+                $next = $r[6];
394
+                while ($next == '{') {
395
+                    phraser_arg($rec, $sep, [], $champ);
396
+                    $args = ltrim($rec);
397
+                    $next = $args[0] ?? '';
398
+                }
399
+                while ($next == '|') {
400
+                    $pos_apres = 0;
401
+                    phraser_args($rec, $par, $sep, [], $champ, $pos_apres);
402
+                    $args = substr($rec, $pos_apres);
403
+                    $next = $args[0] ?? '';
404
+                }
405
+                // Si erreur de syntaxe dans un sous-argument, propager.
406
+                if ($champ->param === false) {
407
+                    $err_f = true;
408
+                } else {
409
+                    phraser_vieux($champ);
410
+                }
411
+                if ($par == ')') {
412
+                    $args = substr($args, 1);
413
+                }
414
+                $collecte[] = $champ;
415
+                $result[] = $champ;
416
+            }
417
+        }
418
+        if (isset($args[0]) and $args[0] == ',') {
419
+            $args = ltrim(substr($args, 1));
420
+            if ($collecte) {
421
+                $res[] = $collecte;
422
+                $collecte = [];
423
+            }
424
+        }
425
+    }
426
+    if ($collecte) {
427
+        $res[] = $collecte;
428
+        $collecte = [];
429
+    }
430
+    $texte = substr($args, 1);
431
+    $source = substr($suite, 0, strlen($suite) - strlen($texte));
432
+    // propager les erreurs, et ignorer les param vides
433
+    if ($pointeur_champ->param !== false) {
434
+        if ($err_f) {
435
+            $pointeur_champ->param = false;
436
+        } elseif ($fonc !== '' || count($res) > 1) {
437
+            $pointeur_champ->param[] = $res;
438
+        }
439
+    }
440
+    // pour les balises avec faux filtres qui boudent ce dur larbeur
441
+    $pointeur_champ->fonctions[] = [$fonc, $source];
442
+
443
+    return $result;
444 444
 }
445 445
 
446 446
 
447 447
 function phraser_champs_exterieurs($texte, $ligne, $sep, $nested) {
448
-	$res = [];
449
-	while (($p = strpos($texte, (string) "%$sep")) !== false) {
450
-		if (!preg_match(',^%' . preg_quote($sep) . '([0-9]+)@,', substr($texte, $p), $m)) {
451
-			break;
452
-		}
453
-		$debut = substr($texte, 0, $p);
454
-		$texte = substr($texte, $p + strlen($m[0]));
455
-		if ($p) {
456
-			$res = phraser_inclure($debut, $ligne, $res);
457
-		}
458
-		$ligne += substr_count($debut, "\n");
459
-		$res[] = $nested[$m[1]];
460
-	}
461
-
462
-	return (($texte === '') ? $res : phraser_inclure($texte, $ligne, $res));
448
+    $res = [];
449
+    while (($p = strpos($texte, (string) "%$sep")) !== false) {
450
+        if (!preg_match(',^%' . preg_quote($sep) . '([0-9]+)@,', substr($texte, $p), $m)) {
451
+            break;
452
+        }
453
+        $debut = substr($texte, 0, $p);
454
+        $texte = substr($texte, $p + strlen($m[0]));
455
+        if ($p) {
456
+            $res = phraser_inclure($debut, $ligne, $res);
457
+        }
458
+        $ligne += substr_count($debut, "\n");
459
+        $res[] = $nested[$m[1]];
460
+    }
461
+
462
+    return (($texte === '') ? $res : phraser_inclure($texte, $ligne, $res));
463 463
 }
464 464
 
465 465
 function phraser_champs_interieurs($texte, $ligne, $sep, $result) {
466
-	$i = 0; // en fait count($result)
467
-	$x = '';
468
-
469
-	while (true) {
470
-		$j = $i;
471
-		$n = $ligne;
472
-		while (preg_match(CHAMP_ETENDU, $texte, $match)) {
473
-			$p = strpos($texte, (string) $match[0]);
474
-			$debut = substr($texte, 0, $p);
475
-			if ($p) {
476
-				$result[$i] = $debut;
477
-				$i++;
478
-			}
479
-			$nom = $match[4];
480
-			$champ = new Champ();
481
-			// ca ne marche pas encore en cas de champ imbrique
482
-			$champ->ligne = $x ? 0 : ($n + substr_count($debut, "\n"));
483
-			$champ->nom_boucle = $match[3];
484
-			$champ->nom_champ = $nom;
485
-			$champ->etoile = $match[6];
486
-			// phraser_args indiquera ou commence apres
487
-			$pos_apres = 0;
488
-			$result = phraser_args($match[7], ')', $sep, $result, $champ, $pos_apres);
489
-			phraser_vieux($champ);
490
-			$champ->avant =	phraser_champs_exterieurs($match[1], $n, $sep, $result);
491
-			$debut = substr($match[7], $pos_apres + 1);
492
-			if (!empty($debut)) {
493
-				$n += substr_count(substr($texte, 0, strpos($texte, $debut)), "\n");
494
-			}
495
-			$champ->apres = phraser_champs_exterieurs($debut, $n, $sep, $result);
496
-
497
-			// reinjecter la boucle si c'en est une
498
-			phraser_boucle_placeholder($champ);
499
-
500
-			$result[$i] = $champ;
501
-			$i++;
502
-			$texte = substr($texte, $p + strlen($match[0]));
503
-		}
504
-		if ($texte !== '') {
505
-			$result[$i] = $texte;
506
-			$i++;
507
-		}
508
-		$x = '';
509
-
510
-		while ($j < $i) {
511
-			$z = $result[$j];
512
-			// j'aurais besoin de connaitre le nombre de lignes...
513
-			if (is_object($z)) {
514
-				$x .= "%$sep$j@";
515
-			} else {
516
-				$x .= $z;
517
-			}
518
-			$j++;
519
-		}
520
-		if (preg_match(CHAMP_ETENDU, $x)) {
521
-			$texte = $x;
522
-		} else {
523
-			return phraser_champs_exterieurs($x, $ligne, $sep, $result);
524
-		}
525
-	}
466
+    $i = 0; // en fait count($result)
467
+    $x = '';
468
+
469
+    while (true) {
470
+        $j = $i;
471
+        $n = $ligne;
472
+        while (preg_match(CHAMP_ETENDU, $texte, $match)) {
473
+            $p = strpos($texte, (string) $match[0]);
474
+            $debut = substr($texte, 0, $p);
475
+            if ($p) {
476
+                $result[$i] = $debut;
477
+                $i++;
478
+            }
479
+            $nom = $match[4];
480
+            $champ = new Champ();
481
+            // ca ne marche pas encore en cas de champ imbrique
482
+            $champ->ligne = $x ? 0 : ($n + substr_count($debut, "\n"));
483
+            $champ->nom_boucle = $match[3];
484
+            $champ->nom_champ = $nom;
485
+            $champ->etoile = $match[6];
486
+            // phraser_args indiquera ou commence apres
487
+            $pos_apres = 0;
488
+            $result = phraser_args($match[7], ')', $sep, $result, $champ, $pos_apres);
489
+            phraser_vieux($champ);
490
+            $champ->avant =	phraser_champs_exterieurs($match[1], $n, $sep, $result);
491
+            $debut = substr($match[7], $pos_apres + 1);
492
+            if (!empty($debut)) {
493
+                $n += substr_count(substr($texte, 0, strpos($texte, $debut)), "\n");
494
+            }
495
+            $champ->apres = phraser_champs_exterieurs($debut, $n, $sep, $result);
496
+
497
+            // reinjecter la boucle si c'en est une
498
+            phraser_boucle_placeholder($champ);
499
+
500
+            $result[$i] = $champ;
501
+            $i++;
502
+            $texte = substr($texte, $p + strlen($match[0]));
503
+        }
504
+        if ($texte !== '') {
505
+            $result[$i] = $texte;
506
+            $i++;
507
+        }
508
+        $x = '';
509
+
510
+        while ($j < $i) {
511
+            $z = $result[$j];
512
+            // j'aurais besoin de connaitre le nombre de lignes...
513
+            if (is_object($z)) {
514
+                $x .= "%$sep$j@";
515
+            } else {
516
+                $x .= $z;
517
+            }
518
+            $j++;
519
+        }
520
+        if (preg_match(CHAMP_ETENDU, $x)) {
521
+            $texte = $x;
522
+        } else {
523
+            return phraser_champs_exterieurs($x, $ligne, $sep, $result);
524
+        }
525
+    }
526 526
 }
527 527
 
528 528
 function phraser_vieux(&$champ) {
529
-	$nom = $champ->nom_champ;
530
-	if ($nom == 'EMBED_DOCUMENT') {
531
-		if (!function_exists('phraser_vieux_emb')) {
532
-			include_spip('public/normaliser');
533
-		}
534
-		phraser_vieux_emb($champ);
535
-	} elseif ($nom == 'EXPOSER') {
536
-		if (!function_exists('phraser_vieux_exposer')) {
537
-			include_spip('public/normaliser');
538
-		}
539
-		phraser_vieux_exposer($champ);
540
-	} elseif ($champ->param) {
541
-		if ($nom == 'FORMULAIRE_RECHERCHE') {
542
-			if (!function_exists('phraser_vieux_recherche')) {
543
-				include_spip('public/normaliser');
544
-			}
545
-			phraser_vieux_recherche($champ);
546
-		} elseif (preg_match(',^LOGO_[A-Z]+,', $nom)) {
547
-			if (!function_exists('phraser_vieux_logos')) {
548
-				include_spip('public/normaliser');
549
-			}
550
-			phraser_vieux_logos($champ);
551
-		} elseif ($nom == 'MODELE') {
552
-			if (!function_exists('phraser_vieux_modele')) {
553
-				include_spip('public/normaliser');
554
-			}
555
-			phraser_vieux_modele($champ);
556
-		} elseif ($nom == 'INCLURE' or $nom == 'INCLUDE') {
557
-			if (!function_exists('phraser_vieux_inclu')) {
558
-				include_spip('public/normaliser');
559
-			}
560
-			phraser_vieux_inclu($champ);
561
-		}
562
-	}
529
+    $nom = $champ->nom_champ;
530
+    if ($nom == 'EMBED_DOCUMENT') {
531
+        if (!function_exists('phraser_vieux_emb')) {
532
+            include_spip('public/normaliser');
533
+        }
534
+        phraser_vieux_emb($champ);
535
+    } elseif ($nom == 'EXPOSER') {
536
+        if (!function_exists('phraser_vieux_exposer')) {
537
+            include_spip('public/normaliser');
538
+        }
539
+        phraser_vieux_exposer($champ);
540
+    } elseif ($champ->param) {
541
+        if ($nom == 'FORMULAIRE_RECHERCHE') {
542
+            if (!function_exists('phraser_vieux_recherche')) {
543
+                include_spip('public/normaliser');
544
+            }
545
+            phraser_vieux_recherche($champ);
546
+        } elseif (preg_match(',^LOGO_[A-Z]+,', $nom)) {
547
+            if (!function_exists('phraser_vieux_logos')) {
548
+                include_spip('public/normaliser');
549
+            }
550
+            phraser_vieux_logos($champ);
551
+        } elseif ($nom == 'MODELE') {
552
+            if (!function_exists('phraser_vieux_modele')) {
553
+                include_spip('public/normaliser');
554
+            }
555
+            phraser_vieux_modele($champ);
556
+        } elseif ($nom == 'INCLURE' or $nom == 'INCLUDE') {
557
+            if (!function_exists('phraser_vieux_inclu')) {
558
+                include_spip('public/normaliser');
559
+            }
560
+            phraser_vieux_inclu($champ);
561
+        }
562
+    }
563 563
 }
564 564
 
565 565
 
@@ -587,200 +587,200 @@  discard block
 block discarded – undo
587 587
  **/
588 588
 function phraser_criteres($params, &$result) {
589 589
 
590
-	$err_ci = ''; // indiquera s'il y a eu une erreur
591
-	$args = [];
592
-	$type = $result->type_requete;
593
-	$doublons = [];
594
-	foreach ($params as $v) {
595
-		$var = $v[1][0];
596
-		$param = ($var->type != 'texte') ? '' : $var->texte;
597
-		if (((is_countable($v) ? count($v) : 0) > 2) && (!preg_match(',[^A-Za-z]IN[^A-Za-z],i', $param))) {
598
-			// plus d'un argument et pas le critere IN:
599
-			// detecter comme on peut si c'est le critere implicite LIMIT debut, fin
600
-			if (
601
-				$var->type != 'texte'
602
-				or preg_match('/^(n|n-|(n-)?\d+)$/S', $param)
603
-			) {
604
-				$op = ',';
605
-				$not = '';
606
-				$cond = false;
607
-			} else {
608
-				// Le debut du premier argument est l'operateur
609
-				preg_match('/^([!]?)([a-zA-Z][a-zA-Z0-9_]*)[[:space:]]*(\??)[[:space:]]*(.*)$/ms', $param, $m);
610
-				$op = $m[2];
611
-				$not = $m[1];
612
-				$cond = $m[3];
613
-				// virer le premier argument,
614
-				// et mettre son reliquat eventuel
615
-				// Recopier pour ne pas alterer le texte source
616
-				// utile au debusqueur
617
-				if ($m[4]) {
618
-					// une maniere tres sale de supprimer les "' autour de {critere "xxx","yyy"}
619
-					if (preg_match(',^(["\'])(.*)\1$,', $m[4])) {
620
-						$c = null;
621
-						eval('$c = ' . $m[4] . ';');
622
-						if (isset($c)) {
623
-							$m[4] = $c;
624
-						}
625
-					}
626
-					$texte = new Texte();
627
-					$texte->texte = $m[4];
628
-					$v[1][0] = $texte;
629
-				} else {
630
-					array_shift($v[1]);
631
-				}
632
-			}
633
-			array_shift($v); // $v[O] est vide
634
-			$crit = new Critere();
635
-			$crit->op = $op;
636
-			$crit->not = $not;
637
-			$crit->cond = $cond;
638
-			$crit->exclus = '';
639
-			$crit->param = $v;
640
-			$args[] = $crit;
641
-		} else {
642
-			if ($var->type != 'texte') {
643
-				// cas 1 seul arg ne commencant pas par du texte brut:
644
-				// erreur ou critere infixe "/"
645
-				if (($v[1][1]->type != 'texte') || (trim($v[1][1]->texte) != '/')) {
646
-					$err_ci = [
647
-						'zbug_critere_inconnu',
648
-						['critere' => $var->nom_champ]
649
-					];
650
-					erreur_squelette($err_ci, $result);
651
-				} else {
652
-					$crit = new Critere();
653
-					$crit->op = '/';
654
-					$crit->not = '';
655
-					$crit->exclus = '';
656
-					$crit->param = [[$v[1][0]], [$v[1][2]]];
657
-					$args[] = $crit;
658
-				}
659
-			} else {
660
-				// traiter qq lexemes particuliers pour faciliter la suite
661
-				// les separateurs
662
-				if ($var->apres) {
663
-					$result->separateur[] = $param;
664
-				} elseif (($param == 'tout') or ($param == 'tous')) {
665
-					$result->modificateur['tout'] = true;
666
-				} elseif ($param == 'plat') {
667
-					$result->modificateur['plat'] = true;
668
-				}
669
-
670
-				// Boucle hierarchie, analyser le critere id_rubrique
671
-				// et les autres critères {id_x} pour forcer {tout} sur
672
-				// ceux-ci pour avoir la rubrique mere...
673
-				// Les autres critères de la boucle hierarchie doivent être
674
-				// traités normalement.
675
-				elseif (
676
-					strcasecmp($type, 'hierarchie') == 0
677
-					and !preg_match(",^id_rubrique\b,", $param)
678
-					and preg_match(',^id_\w+\s*$,', $param)
679
-				) {
680
-					$result->modificateur['tout'] = true;
681
-				} elseif (strcasecmp($type, 'hierarchie') == 0 and $param == 'id_rubrique') {
682
-					// rien a faire sur {id_rubrique} tout seul
683
-				} else {
684
-					// pas d'emplacement statique, faut un dynamique
685
-					// mais il y a 2 cas qui ont les 2 !
686
-					if (($param == 'unique') || (preg_match(',^!?doublons *,', $param))) {
687
-						// cette variable sera inseree dans le code
688
-						// et son nom sert d'indicateur des maintenant
689
-						$result->doublons = '$doublons_index';
690
-						if ($param == 'unique') {
691
-							$param = 'doublons';
692
-						}
693
-					} elseif ($param == 'recherche') {
694
-						// meme chose (a cause de #nom_de_boucle:URL_*)
695
-						$result->hash = ' ';
696
-					}
697
-
698
-					if (preg_match(',^ *([0-9-]+) *(/) *(.+) *$,', $param, $m)) {
699
-						$crit = phraser_critere_infixe($m[1], $m[3], $v, '/', '', '');
700
-					} elseif (
701
-						preg_match(',^([!]?)(' . CHAMP_SQL_PLUS_FONC .
702
-						')[[:space:]]*(\??)(!?)(<=?|>=?|==?|\b(?:IN|LIKE)\b)(.*)$,is', $param, $m)
703
-					) {
704
-						$a2 = trim($m[8]);
705
-						if ($a2 and ($a2[0] == "'" or $a2[0] == '"') and ($a2[0] == substr($a2, -1))) {
706
-							$a2 = substr($a2, 1, -1);
707
-						}
708
-						$crit = phraser_critere_infixe(
709
-							$m[2],
710
-							$a2,
711
-							$v,
712
-							(($m[2] == 'lang_select') ? $m[2] : $m[7]),
713
-							$m[6],
714
-							$m[5]
715
-						);
716
-						$crit->exclus = $m[1];
717
-					} elseif (
718
-						preg_match('/^([!]?)\s*(' .
719
-						CHAMP_SQL_PLUS_FONC .
720
-						')\s*(\??)(.*)$/is', $param, $m)
721
-					) {
722
-						// contient aussi les comparaisons implicites !
723
-						// Comme ci-dessus:
724
-						// le premier arg contient l'operateur
725
-						array_shift($v);
726
-						if ($m[6]) {
727
-							$v[0][0] = new Texte();
728
-							$v[0][0]->texte = $m[6];
729
-						} else {
730
-							array_shift($v[0]);
731
-							if (!$v[0]) {
732
-								array_shift($v);
733
-							}
734
-						}
735
-						$crit = new Critere();
736
-						$crit->op = $m[2];
737
-						$crit->param = $v;
738
-						$crit->not = $m[1];
739
-						$crit->cond = $m[5];
740
-					} else {
741
-						$err_ci = [
742
-							'zbug_critere_inconnu',
743
-							['critere' => $param]
744
-						];
745
-						erreur_squelette($err_ci, $result);
746
-					}
747
-
748
-					if ((!preg_match(',^!?doublons *,', $param)) || $crit->not) {
749
-						$args[] = $crit;
750
-					} else {
751
-						$doublons[] = $crit;
752
-					}
753
-				}
754
-			}
755
-		}
756
-	}
757
-
758
-	// les doublons non nies doivent etre le dernier critere
759
-	// pour que la variable $doublon_index ait la bonne valeur
760
-	// cf critere_doublon
761
-	if ($doublons) {
762
-		$args = [...$args, ...$doublons];
763
-	}
764
-
765
-	// Si erreur, laisser la chaine dans ce champ pour le HTTP 503
766
-	if (!$err_ci) {
767
-		$result->criteres = $args;
768
-	}
590
+    $err_ci = ''; // indiquera s'il y a eu une erreur
591
+    $args = [];
592
+    $type = $result->type_requete;
593
+    $doublons = [];
594
+    foreach ($params as $v) {
595
+        $var = $v[1][0];
596
+        $param = ($var->type != 'texte') ? '' : $var->texte;
597
+        if (((is_countable($v) ? count($v) : 0) > 2) && (!preg_match(',[^A-Za-z]IN[^A-Za-z],i', $param))) {
598
+            // plus d'un argument et pas le critere IN:
599
+            // detecter comme on peut si c'est le critere implicite LIMIT debut, fin
600
+            if (
601
+                $var->type != 'texte'
602
+                or preg_match('/^(n|n-|(n-)?\d+)$/S', $param)
603
+            ) {
604
+                $op = ',';
605
+                $not = '';
606
+                $cond = false;
607
+            } else {
608
+                // Le debut du premier argument est l'operateur
609
+                preg_match('/^([!]?)([a-zA-Z][a-zA-Z0-9_]*)[[:space:]]*(\??)[[:space:]]*(.*)$/ms', $param, $m);
610
+                $op = $m[2];
611
+                $not = $m[1];
612
+                $cond = $m[3];
613
+                // virer le premier argument,
614
+                // et mettre son reliquat eventuel
615
+                // Recopier pour ne pas alterer le texte source
616
+                // utile au debusqueur
617
+                if ($m[4]) {
618
+                    // une maniere tres sale de supprimer les "' autour de {critere "xxx","yyy"}
619
+                    if (preg_match(',^(["\'])(.*)\1$,', $m[4])) {
620
+                        $c = null;
621
+                        eval('$c = ' . $m[4] . ';');
622
+                        if (isset($c)) {
623
+                            $m[4] = $c;
624
+                        }
625
+                    }
626
+                    $texte = new Texte();
627
+                    $texte->texte = $m[4];
628
+                    $v[1][0] = $texte;
629
+                } else {
630
+                    array_shift($v[1]);
631
+                }
632
+            }
633
+            array_shift($v); // $v[O] est vide
634
+            $crit = new Critere();
635
+            $crit->op = $op;
636
+            $crit->not = $not;
637
+            $crit->cond = $cond;
638
+            $crit->exclus = '';
639
+            $crit->param = $v;
640
+            $args[] = $crit;
641
+        } else {
642
+            if ($var->type != 'texte') {
643
+                // cas 1 seul arg ne commencant pas par du texte brut:
644
+                // erreur ou critere infixe "/"
645
+                if (($v[1][1]->type != 'texte') || (trim($v[1][1]->texte) != '/')) {
646
+                    $err_ci = [
647
+                        'zbug_critere_inconnu',
648
+                        ['critere' => $var->nom_champ]
649
+                    ];
650
+                    erreur_squelette($err_ci, $result);
651
+                } else {
652
+                    $crit = new Critere();
653
+                    $crit->op = '/';
654
+                    $crit->not = '';
655
+                    $crit->exclus = '';
656
+                    $crit->param = [[$v[1][0]], [$v[1][2]]];
657
+                    $args[] = $crit;
658
+                }
659
+            } else {
660
+                // traiter qq lexemes particuliers pour faciliter la suite
661
+                // les separateurs
662
+                if ($var->apres) {
663
+                    $result->separateur[] = $param;
664
+                } elseif (($param == 'tout') or ($param == 'tous')) {
665
+                    $result->modificateur['tout'] = true;
666
+                } elseif ($param == 'plat') {
667
+                    $result->modificateur['plat'] = true;
668
+                }
669
+
670
+                // Boucle hierarchie, analyser le critere id_rubrique
671
+                // et les autres critères {id_x} pour forcer {tout} sur
672
+                // ceux-ci pour avoir la rubrique mere...
673
+                // Les autres critères de la boucle hierarchie doivent être
674
+                // traités normalement.
675
+                elseif (
676
+                    strcasecmp($type, 'hierarchie') == 0
677
+                    and !preg_match(",^id_rubrique\b,", $param)
678
+                    and preg_match(',^id_\w+\s*$,', $param)
679
+                ) {
680
+                    $result->modificateur['tout'] = true;
681
+                } elseif (strcasecmp($type, 'hierarchie') == 0 and $param == 'id_rubrique') {
682
+                    // rien a faire sur {id_rubrique} tout seul
683
+                } else {
684
+                    // pas d'emplacement statique, faut un dynamique
685
+                    // mais il y a 2 cas qui ont les 2 !
686
+                    if (($param == 'unique') || (preg_match(',^!?doublons *,', $param))) {
687
+                        // cette variable sera inseree dans le code
688
+                        // et son nom sert d'indicateur des maintenant
689
+                        $result->doublons = '$doublons_index';
690
+                        if ($param == 'unique') {
691
+                            $param = 'doublons';
692
+                        }
693
+                    } elseif ($param == 'recherche') {
694
+                        // meme chose (a cause de #nom_de_boucle:URL_*)
695
+                        $result->hash = ' ';
696
+                    }
697
+
698
+                    if (preg_match(',^ *([0-9-]+) *(/) *(.+) *$,', $param, $m)) {
699
+                        $crit = phraser_critere_infixe($m[1], $m[3], $v, '/', '', '');
700
+                    } elseif (
701
+                        preg_match(',^([!]?)(' . CHAMP_SQL_PLUS_FONC .
702
+                        ')[[:space:]]*(\??)(!?)(<=?|>=?|==?|\b(?:IN|LIKE)\b)(.*)$,is', $param, $m)
703
+                    ) {
704
+                        $a2 = trim($m[8]);
705
+                        if ($a2 and ($a2[0] == "'" or $a2[0] == '"') and ($a2[0] == substr($a2, -1))) {
706
+                            $a2 = substr($a2, 1, -1);
707
+                        }
708
+                        $crit = phraser_critere_infixe(
709
+                            $m[2],
710
+                            $a2,
711
+                            $v,
712
+                            (($m[2] == 'lang_select') ? $m[2] : $m[7]),
713
+                            $m[6],
714
+                            $m[5]
715
+                        );
716
+                        $crit->exclus = $m[1];
717
+                    } elseif (
718
+                        preg_match('/^([!]?)\s*(' .
719
+                        CHAMP_SQL_PLUS_FONC .
720
+                        ')\s*(\??)(.*)$/is', $param, $m)
721
+                    ) {
722
+                        // contient aussi les comparaisons implicites !
723
+                        // Comme ci-dessus:
724
+                        // le premier arg contient l'operateur
725
+                        array_shift($v);
726
+                        if ($m[6]) {
727
+                            $v[0][0] = new Texte();
728
+                            $v[0][0]->texte = $m[6];
729
+                        } else {
730
+                            array_shift($v[0]);
731
+                            if (!$v[0]) {
732
+                                array_shift($v);
733
+                            }
734
+                        }
735
+                        $crit = new Critere();
736
+                        $crit->op = $m[2];
737
+                        $crit->param = $v;
738
+                        $crit->not = $m[1];
739
+                        $crit->cond = $m[5];
740
+                    } else {
741
+                        $err_ci = [
742
+                            'zbug_critere_inconnu',
743
+                            ['critere' => $param]
744
+                        ];
745
+                        erreur_squelette($err_ci, $result);
746
+                    }
747
+
748
+                    if ((!preg_match(',^!?doublons *,', $param)) || $crit->not) {
749
+                        $args[] = $crit;
750
+                    } else {
751
+                        $doublons[] = $crit;
752
+                    }
753
+                }
754
+            }
755
+        }
756
+    }
757
+
758
+    // les doublons non nies doivent etre le dernier critere
759
+    // pour que la variable $doublon_index ait la bonne valeur
760
+    // cf critere_doublon
761
+    if ($doublons) {
762
+        $args = [...$args, ...$doublons];
763
+    }
764
+
765
+    // Si erreur, laisser la chaine dans ce champ pour le HTTP 503
766
+    if (!$err_ci) {
767
+        $result->criteres = $args;
768
+    }
769 769
 }
770 770
 
771 771
 function phraser_critere_infixe($arg1, $arg2, $args, $op, $not, $cond) {
772
-	$args[0] = new Texte();
773
-	$args[0]->texte = $arg1;
774
-	$args[0] = [$args[0]];
775
-	$args[1][0] = new Texte();
776
-	$args[1][0]->texte = $arg2;
777
-	$crit = new Critere();
778
-	$crit->op = $op;
779
-	$crit->not = $not;
780
-	$crit->cond = $cond;
781
-	$crit->param = $args;
782
-
783
-	return $crit;
772
+    $args[0] = new Texte();
773
+    $args[0]->texte = $arg1;
774
+    $args[0] = [$args[0]];
775
+    $args[1][0] = new Texte();
776
+    $args[1][0]->texte = $arg2;
777
+    $crit = new Critere();
778
+    $crit->op = $op;
779
+    $crit->not = $not;
780
+    $crit->cond = $cond;
781
+    $crit->param = $args;
782
+
783
+    return $crit;
784 784
 }
785 785
 
786 786
 /**
@@ -791,12 +791,12 @@  discard block
 block discarded – undo
791 791
  * @return int
792 792
  */
793 793
 function public_compte_ligne($texte, $debut = 0, $fin = null) {
794
-	if (is_null($fin)) {
795
-		return substr_count($texte, "\n", $debut);
796
-	}
797
-	else {
798
-		return substr_count($texte, "\n", $debut, $fin - $debut);
799
-	}
794
+    if (is_null($fin)) {
795
+        return substr_count($texte, "\n", $debut);
796
+    }
797
+    else {
798
+        return substr_count($texte, "\n", $debut, $fin - $debut);
799
+    }
800 800
 }
801 801
 
802 802
 
@@ -812,87 +812,87 @@  discard block
 block discarded – undo
812 812
  * @return array|null
813 813
  */
814 814
 function public_trouver_premiere_boucle($texte, $id_parent, $descr, $pos_debut_texte = 0) {
815
-	$premiere_boucle = null;
816
-	$pos_derniere_boucle_anonyme = $pos_debut_texte;
817
-
818
-	$current_pos = $pos_debut_texte;
819
-	while (($pos_boucle = strpos($texte, BALISE_BOUCLE, $current_pos)) !== false) {
820
-		$current_pos = $pos_boucle + 1;
821
-		$pos_parent = strpos($texte, '(', $pos_boucle);
822
-
823
-		$id_boucle = '';
824
-		if ($pos_parent !== false) {
825
-			$id_boucle = trim(substr($texte, $pos_boucle + strlen(BALISE_BOUCLE), $pos_parent - $pos_boucle - strlen(BALISE_BOUCLE)));
826
-		}
827
-		if (
828
-			$pos_parent === false
829
-			or (strlen($id_boucle) and !(is_numeric($id_boucle) or strpos($id_boucle, '_') === 0))
830
-		) {
831
-			$result = new Boucle();
832
-			$result->id_parent = $id_parent;
833
-			$result->descr = $descr;
834
-
835
-			// un id_boucle pour l'affichage de l'erreur
836
-			if (!strlen($id_boucle)) {
837
-				$id_boucle = substr($texte, $pos_boucle + strlen(BALISE_BOUCLE), 15);
838
-			}
839
-			$result->id_boucle = $id_boucle;
840
-			$err_b = ['zbug_erreur_boucle_syntaxe', ['id' => $id_boucle]];
841
-			erreur_squelette($err_b, $result);
842
-
843
-			continue;
844
-		}
845
-		else {
846
-			$boucle = [
847
-				'id_boucle' => $id_boucle,
848
-				'id_boucle_err' => $id_boucle,
849
-				'debut_boucle' => $pos_boucle,
850
-				'pos_boucle' => $pos_boucle,
851
-				'pos_parent' => $pos_parent,
852
-				'pos_precond' => false,
853
-				'pos_precond_inside' => false,
854
-				'pos_preaff' => false,
855
-				'pos_preaff_inside' => false,
856
-			];
857
-
858
-			// un id_boucle pour l'affichage de l'erreur sur les boucle anonymes
859
-			if (!strlen($id_boucle)) {
860
-				$boucle['id_boucle_err'] = substr($texte, $pos_boucle + strlen(BALISE_BOUCLE), 15);
861
-			}
862
-
863
-			// trouver sa position de depart reelle : au <Bxx> ou au <BBxx>
864
-			$precond_boucle = BALISE_PRECOND_BOUCLE . $id_boucle . '>';
865
-			$pos_precond = strpos($texte, $precond_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
866
-			if (
867
-				$pos_precond !== false
868
-				and $pos_precond < $boucle['debut_boucle']
869
-			) {
870
-				$boucle['debut_boucle'] = $pos_precond;
871
-				$boucle['pos_precond'] = $pos_precond;
872
-				$boucle['pos_precond_inside'] = $pos_precond + strlen($precond_boucle);
873
-			}
874
-
875
-			$preaff_boucle = BALISE_PREAFF_BOUCLE . $id_boucle . '>';
876
-			$pos_preaff = strpos($texte, $preaff_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
877
-			if (
878
-				$pos_preaff !== false
879
-				and $pos_preaff < $boucle['debut_boucle']
880
-			) {
881
-				$boucle['debut_boucle'] = $pos_preaff;
882
-				$boucle['pos_preaff'] = $pos_preaff;
883
-				$boucle['pos_preaff_inside'] = $pos_preaff + strlen($preaff_boucle);
884
-			}
885
-			if (!strlen($id_boucle)) {
886
-				$pos_derniere_boucle_anonyme = $pos_boucle;
887
-			}
888
-
889
-			if (is_null($premiere_boucle) or $premiere_boucle['debut_boucle'] > $boucle['debut_boucle']) {
890
-				$premiere_boucle = $boucle;
891
-			}
892
-		}
893
-	}
894
-
895
-	return $premiere_boucle;
815
+    $premiere_boucle = null;
816
+    $pos_derniere_boucle_anonyme = $pos_debut_texte;
817
+
818
+    $current_pos = $pos_debut_texte;
819
+    while (($pos_boucle = strpos($texte, BALISE_BOUCLE, $current_pos)) !== false) {
820
+        $current_pos = $pos_boucle + 1;
821
+        $pos_parent = strpos($texte, '(', $pos_boucle);
822
+
823
+        $id_boucle = '';
824
+        if ($pos_parent !== false) {
825
+            $id_boucle = trim(substr($texte, $pos_boucle + strlen(BALISE_BOUCLE), $pos_parent - $pos_boucle - strlen(BALISE_BOUCLE)));
826
+        }
827
+        if (
828
+            $pos_parent === false
829
+            or (strlen($id_boucle) and !(is_numeric($id_boucle) or strpos($id_boucle, '_') === 0))
830
+        ) {
831
+            $result = new Boucle();
832
+            $result->id_parent = $id_parent;
833
+            $result->descr = $descr;
834
+
835
+            // un id_boucle pour l'affichage de l'erreur
836
+            if (!strlen($id_boucle)) {
837
+                $id_boucle = substr($texte, $pos_boucle + strlen(BALISE_BOUCLE), 15);
838
+            }
839
+            $result->id_boucle = $id_boucle;
840
+            $err_b = ['zbug_erreur_boucle_syntaxe', ['id' => $id_boucle]];
841
+            erreur_squelette($err_b, $result);
842
+
843
+            continue;
844
+        }
845
+        else {
846
+            $boucle = [
847
+                'id_boucle' => $id_boucle,
848
+                'id_boucle_err' => $id_boucle,
849
+                'debut_boucle' => $pos_boucle,
850
+                'pos_boucle' => $pos_boucle,
851
+                'pos_parent' => $pos_parent,
852
+                'pos_precond' => false,
853
+                'pos_precond_inside' => false,
854
+                'pos_preaff' => false,
855
+                'pos_preaff_inside' => false,
856
+            ];
857
+
858
+            // un id_boucle pour l'affichage de l'erreur sur les boucle anonymes
859
+            if (!strlen($id_boucle)) {
860
+                $boucle['id_boucle_err'] = substr($texte, $pos_boucle + strlen(BALISE_BOUCLE), 15);
861
+            }
862
+
863
+            // trouver sa position de depart reelle : au <Bxx> ou au <BBxx>
864
+            $precond_boucle = BALISE_PRECOND_BOUCLE . $id_boucle . '>';
865
+            $pos_precond = strpos($texte, $precond_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
866
+            if (
867
+                $pos_precond !== false
868
+                and $pos_precond < $boucle['debut_boucle']
869
+            ) {
870
+                $boucle['debut_boucle'] = $pos_precond;
871
+                $boucle['pos_precond'] = $pos_precond;
872
+                $boucle['pos_precond_inside'] = $pos_precond + strlen($precond_boucle);
873
+            }
874
+
875
+            $preaff_boucle = BALISE_PREAFF_BOUCLE . $id_boucle . '>';
876
+            $pos_preaff = strpos($texte, $preaff_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
877
+            if (
878
+                $pos_preaff !== false
879
+                and $pos_preaff < $boucle['debut_boucle']
880
+            ) {
881
+                $boucle['debut_boucle'] = $pos_preaff;
882
+                $boucle['pos_preaff'] = $pos_preaff;
883
+                $boucle['pos_preaff_inside'] = $pos_preaff + strlen($preaff_boucle);
884
+            }
885
+            if (!strlen($id_boucle)) {
886
+                $pos_derniere_boucle_anonyme = $pos_boucle;
887
+            }
888
+
889
+            if (is_null($premiere_boucle) or $premiere_boucle['debut_boucle'] > $boucle['debut_boucle']) {
890
+                $premiere_boucle = $boucle;
891
+            }
892
+        }
893
+    }
894
+
895
+    return $premiere_boucle;
896 896
 }
897 897
 
898 898
 /**
@@ -907,68 +907,68 @@  discard block
 block discarded – undo
907 907
  * @return mixed
908 908
  */
909 909
 function public_trouver_fin_boucle($texte, $id_parent, $boucle, $pos_debut_texte, $result) {
910
-	$id_boucle = $boucle['id_boucle'];
911
-	$pos_courante = $pos_debut_texte;
912
-
913
-	$boucle['pos_postcond'] = false;
914
-	$boucle['pos_postcond_inside'] = false;
915
-	$boucle['pos_altern'] = false;
916
-	$boucle['pos_altern_inside'] = false;
917
-	$boucle['pos_postaff'] = false;
918
-	$boucle['pos_postaff_inside'] = false;
919
-
920
-	$pos_anonyme_next = null;
921
-	// si c'est une boucle anonyme, chercher la position de la prochaine boucle anonyme
922
-	if (!strlen($id_boucle)) {
923
-		$pos_anonyme_next = strpos($texte, BALISE_BOUCLE . '(', $pos_courante);
924
-	}
925
-
926
-	//
927
-	// 1. Recuperer la partie conditionnelle apres
928
-	//
929
-	$apres_boucle = BALISE_POSTCOND_BOUCLE . $id_boucle . '>';
930
-	$pos_apres = strpos($texte, $apres_boucle, $pos_courante);
931
-	if (
932
-		$pos_apres !== false
933
-		and (!$pos_anonyme_next or $pos_apres < $pos_anonyme_next)
934
-	) {
935
-		$boucle['pos_postcond'] = $pos_apres;
936
-		$pos_apres += strlen($apres_boucle);
937
-		$boucle['pos_postcond_inside'] = $pos_apres;
938
-		$pos_courante = $pos_apres ;
939
-	}
940
-
941
-	//
942
-	// 2. Récuperer la partie alternative apres
943
-	//
944
-	$altern_boucle = BALISE_ALT_BOUCLE . $id_boucle . '>';
945
-	$pos_altern = strpos($texte, $altern_boucle, $pos_courante);
946
-	if (
947
-		$pos_altern !== false
948
-		and (!$pos_anonyme_next or $pos_altern < $pos_anonyme_next)
949
-	) {
950
-		$boucle['pos_altern'] = $pos_altern;
951
-		$pos_altern += strlen($altern_boucle);
952
-		$boucle['pos_altern_inside'] = $pos_altern;
953
-		$pos_courante = $pos_altern;
954
-	}
955
-
956
-	//
957
-	// 3. Recuperer la partie footer non alternative
958
-	//
959
-	$postaff_boucle = BALISE_POSTAFF_BOUCLE . $id_boucle . '>';
960
-	$pos_postaff = strpos($texte, $postaff_boucle, $pos_courante);
961
-	if (
962
-		$pos_postaff !== false
963
-		and (!$pos_anonyme_next or $pos_postaff < $pos_anonyme_next)
964
-	) {
965
-		$boucle['pos_postaff'] = $pos_postaff;
966
-		$pos_postaff += strlen($postaff_boucle);
967
-		$boucle['pos_postaff_inside'] = $pos_postaff;
968
-		$pos_courante = $pos_postaff ;
969
-	}
970
-
971
-	return $boucle;
910
+    $id_boucle = $boucle['id_boucle'];
911
+    $pos_courante = $pos_debut_texte;
912
+
913
+    $boucle['pos_postcond'] = false;
914
+    $boucle['pos_postcond_inside'] = false;
915
+    $boucle['pos_altern'] = false;
916
+    $boucle['pos_altern_inside'] = false;
917
+    $boucle['pos_postaff'] = false;
918
+    $boucle['pos_postaff_inside'] = false;
919
+
920
+    $pos_anonyme_next = null;
921
+    // si c'est une boucle anonyme, chercher la position de la prochaine boucle anonyme
922
+    if (!strlen($id_boucle)) {
923
+        $pos_anonyme_next = strpos($texte, BALISE_BOUCLE . '(', $pos_courante);
924
+    }
925
+
926
+    //
927
+    // 1. Recuperer la partie conditionnelle apres
928
+    //
929
+    $apres_boucle = BALISE_POSTCOND_BOUCLE . $id_boucle . '>';
930
+    $pos_apres = strpos($texte, $apres_boucle, $pos_courante);
931
+    if (
932
+        $pos_apres !== false
933
+        and (!$pos_anonyme_next or $pos_apres < $pos_anonyme_next)
934
+    ) {
935
+        $boucle['pos_postcond'] = $pos_apres;
936
+        $pos_apres += strlen($apres_boucle);
937
+        $boucle['pos_postcond_inside'] = $pos_apres;
938
+        $pos_courante = $pos_apres ;
939
+    }
940
+
941
+    //
942
+    // 2. Récuperer la partie alternative apres
943
+    //
944
+    $altern_boucle = BALISE_ALT_BOUCLE . $id_boucle . '>';
945
+    $pos_altern = strpos($texte, $altern_boucle, $pos_courante);
946
+    if (
947
+        $pos_altern !== false
948
+        and (!$pos_anonyme_next or $pos_altern < $pos_anonyme_next)
949
+    ) {
950
+        $boucle['pos_altern'] = $pos_altern;
951
+        $pos_altern += strlen($altern_boucle);
952
+        $boucle['pos_altern_inside'] = $pos_altern;
953
+        $pos_courante = $pos_altern;
954
+    }
955
+
956
+    //
957
+    // 3. Recuperer la partie footer non alternative
958
+    //
959
+    $postaff_boucle = BALISE_POSTAFF_BOUCLE . $id_boucle . '>';
960
+    $pos_postaff = strpos($texte, $postaff_boucle, $pos_courante);
961
+    if (
962
+        $pos_postaff !== false
963
+        and (!$pos_anonyme_next or $pos_postaff < $pos_anonyme_next)
964
+    ) {
965
+        $boucle['pos_postaff'] = $pos_postaff;
966
+        $pos_postaff += strlen($postaff_boucle);
967
+        $boucle['pos_postaff_inside'] = $pos_postaff;
968
+        $pos_courante = $pos_postaff ;
969
+    }
970
+
971
+    return $boucle;
972 972
 }
973 973
 
974 974
 
@@ -978,21 +978,21 @@  discard block
 block discarded – undo
978 978
  * @param null|object $boucle
979 979
  */
980 980
 function phraser_boucle_placeholder(&$champ, $boucle_placeholder = null, $boucle = null) {
981
-	static $boucles_connues = [];
982
-	// si c'est un appel pour memoriser une boucle, memorisons la
983
-	if (is_string($champ) and !empty($boucle_placeholder) and !empty($boucle)) {
984
-		$boucles_connues[$boucle_placeholder][$champ] = &$boucle;
985
-	}
986
-	else {
987
-		if (!empty($champ->nom_champ) and !empty($boucles_connues[$champ->nom_champ])) {
988
-			$placeholder = $champ->nom_champ;
989
-			$id = reset($champ->param[0][1]);
990
-			$id = $id->texte;
991
-			if (!empty($boucles_connues[$placeholder][$id])) {
992
-				$champ = $boucles_connues[$placeholder][$id];
993
-			}
994
-		}
995
-	}
981
+    static $boucles_connues = [];
982
+    // si c'est un appel pour memoriser une boucle, memorisons la
983
+    if (is_string($champ) and !empty($boucle_placeholder) and !empty($boucle)) {
984
+        $boucles_connues[$boucle_placeholder][$champ] = &$boucle;
985
+    }
986
+    else {
987
+        if (!empty($champ->nom_champ) and !empty($boucles_connues[$champ->nom_champ])) {
988
+            $placeholder = $champ->nom_champ;
989
+            $id = reset($champ->param[0][1]);
990
+            $id = $id->texte;
991
+            if (!empty($boucles_connues[$placeholder][$id])) {
992
+                $champ = $boucles_connues[$placeholder][$id];
993
+            }
994
+        }
995
+    }
996 996
 }
997 997
 
998 998
 
@@ -1005,274 +1005,274 @@  discard block
 block discarded – undo
1005 1005
  * @return string
1006 1006
  */
1007 1007
 function public_generer_boucle_placeholder($id_boucle, &$boucle, $boucle_placeholder, $nb_lignes) {
1008
-	$placeholder = "[(#{$boucle_placeholder}{" . $id_boucle . '})' . str_pad('', $nb_lignes, "\n") . ']';
1009
-	//memoriser la boucle a reinjecter
1010
-	$id_boucle = "$id_boucle";
1011
-	phraser_boucle_placeholder($id_boucle, $boucle_placeholder, $boucle);
1012
-	return $placeholder;
1008
+    $placeholder = "[(#{$boucle_placeholder}{" . $id_boucle . '})' . str_pad('', $nb_lignes, "\n") . ']';
1009
+    //memoriser la boucle a reinjecter
1010
+    $id_boucle = "$id_boucle";
1011
+    phraser_boucle_placeholder($id_boucle, $boucle_placeholder, $boucle);
1012
+    return $placeholder;
1013 1013
 }
1014 1014
 
1015 1015
 function public_phraser_html_dist($texte, $id_parent, &$boucles, $descr, $ligne_debut_texte = 1, $boucle_placeholder = null) {
1016 1016
 
1017
-	$all_res = [];
1018
-	// definir un placholder pour les boucles dont on est sur d'avoir aucune occurence dans le squelette
1019
-	if (is_null($boucle_placeholder)) {
1020
-		do {
1021
-			$boucle_placeholder = 'BOUCLE_PLACEHOLDER_' . strtoupper(md5(uniqid()));
1022
-		} while (strpos($texte, $boucle_placeholder) !== false);
1023
-	}
1024
-
1025
-	$ligne_debut_initial = $ligne_debut_texte;
1026
-	$pos_debut_texte = 0;
1027
-	while ($boucle = public_trouver_premiere_boucle($texte, $id_parent, $descr, $pos_debut_texte)) {
1028
-		$err_b = ''; // indiquera s'il y a eu une erreur
1029
-		$result = new Boucle();
1030
-		$result->id_parent = $id_parent;
1031
-		$result->descr = $descr;
1032
-
1033
-		$pos_courante = $boucle['pos_boucle'];
1034
-		$pos_parent = $boucle['pos_parent'];
1035
-		$id_boucle_search = $id_boucle = $boucle['id_boucle'];
1036
-
1037
-		$ligne_preaff = $ligne_avant = $ligne_milieu = $ligne_debut_texte + public_compte_ligne($texte, $pos_debut_texte, $pos_parent);
1038
-
1039
-		// boucle anonyme ?
1040
-		if (!strlen($id_boucle)) {
1041
-			$id_boucle = '_anon_L' . $ligne_milieu . '_' . substr(md5('anonyme:' . $id_parent . ':' . json_encode($boucle, JSON_THROW_ON_ERROR)), 0, 8);
1042
-		}
1043
-
1044
-		$pos_debut_boucle = $pos_courante;
1045
-
1046
-		$pos_milieu = $pos_parent;
1047
-
1048
-		// Regarder si on a une partie conditionnelle avant <B_xxx>
1049
-		if ($boucle['pos_precond'] !== false) {
1050
-			$pos_debut_boucle = $boucle['pos_precond'];
1051
-
1052
-			$pos_avant = $boucle['pos_precond_inside'];
1053
-			$result->avant = substr($texte, $pos_avant, $pos_courante - $pos_avant);
1054
-			$ligne_avant = $ligne_debut_texte +  public_compte_ligne($texte, $pos_debut_texte, $pos_avant);
1055
-		}
1056
-
1057
-		// Regarder si on a une partie inconditionnelle avant <BB_xxx>
1058
-		if ($boucle['pos_preaff'] !== false) {
1059
-			$end_preaff = $pos_debut_boucle;
1060
-
1061
-			$pos_preaff = $boucle['pos_preaff_inside'];
1062
-			$result->preaff = substr($texte, $pos_preaff, $end_preaff - $pos_preaff);
1063
-			$ligne_preaff = $ligne_debut_texte +  public_compte_ligne($texte, $pos_debut_texte, $pos_preaff);
1064
-		}
1065
-
1066
-		$result->id_boucle = $id_boucle;
1067
-
1068
-		if (
1069
-			!preg_match(SPEC_BOUCLE, $texte, $match, 0, $pos_milieu)
1070
-			or ($pos_match = strpos($texte, (string) $match[0], $pos_milieu)) === false
1071
-			or $pos_match > $pos_milieu
1072
-		) {
1073
-			$err_b = ['zbug_erreur_boucle_syntaxe', ['id' => $id_boucle]];
1074
-			erreur_squelette($err_b, $result);
1075
-
1076
-			$ligne_debut_texte += public_compte_ligne($texte, $pos_debut_texte, $pos_courante + 1);
1077
-			$pos_debut_texte = $pos_courante + 1;
1078
-			continue;
1079
-		}
1080
-
1081
-		$result->type_requete = $match[0];
1082
-		$pos_milieu += strlen($match[0]);
1083
-		$pos_courante = $pos_milieu; // on s'en sert pour compter les lignes plus precisemment
1084
-
1085
-		$type = $match[1];
1086
-		$jointures = trim($match[2]);
1087
-		$table_optionnelle = ($match[3]);
1088
-		if ($jointures) {
1089
-			// on affecte pas ici les jointures explicites, mais dans la compilation
1090
-			// ou elles seront completees des jointures declarees
1091
-			$result->jointures_explicites = $jointures;
1092
-		}
1093
-
1094
-		if ($table_optionnelle) {
1095
-			$result->table_optionnelle = $type;
1096
-		}
1097
-
1098
-		// 1ere passe sur les criteres, vu comme des arguments sans fct
1099
-		// Resultat mis dans result->param
1100
-		$pos_fin_criteres = $pos_milieu;
1101
-		phraser_args($texte, '/>', '', $all_res, $result, $pos_fin_criteres);
1102
-
1103
-		// En 2e passe result->criteres contiendra un tableau
1104
-		// pour l'instant on met le source (chaine) :
1105
-		// si elle reste ici au final, c'est qu'elle contient une erreur
1106
-		$pos_courante = $pos_fin_criteres; // on s'en sert pour compter les lignes plus precisemment
1107
-		$result->criteres = substr($texte, $pos_milieu, $pos_fin_criteres - $pos_milieu);
1108
-		$pos_milieu = $pos_fin_criteres;
1109
-
1110
-		//
1111
-		// Recuperer la fin :
1112
-		//
1113
-		if ($texte[$pos_milieu] === '/') {
1114
-			// boucle autofermante : pas de partie conditionnelle apres
1115
-			$pos_courante += 2;
1116
-			$result->milieu = '';
1117
-		} else {
1118
-			$pos_milieu += 1;
1119
-
1120
-			$fin_boucle = BALISE_FIN_BOUCLE . $id_boucle_search . '>';
1121
-			$pos_fin = strpos($texte, $fin_boucle, $pos_milieu);
1122
-			if ($pos_fin === false) {
1123
-				$err_b = [
1124
-					'zbug_erreur_boucle_fermant',
1125
-					['id' => $id_boucle]
1126
-				];
1127
-				erreur_squelette($err_b, $result);
1128
-				$pos_courante += strlen($fin_boucle);
1129
-			}
1130
-			else {
1131
-				// verifier une eventuelle imbrication d'une boucle homonyme
1132
-				// (interdite, generera une erreur plus loin, mais permet de signaler la bonne erreur)
1133
-				$search_debut_boucle = BALISE_BOUCLE . $id_boucle_search . '(';
1134
-				$search_from = $pos_milieu;
1135
-				$nb_open = 1;
1136
-				$nb_close = 1;
1137
-				$maxiter = 0;
1138
-				do {
1139
-					while (
1140
-						$nb_close < $nb_open
1141
-						and $p = strpos($texte, $fin_boucle, $pos_fin + 1)
1142
-					) {
1143
-						$nb_close++;
1144
-						$pos_fin = $p;
1145
-					}
1146
-					// si on a pas trouve assez de boucles fermantes, sortir de la, on a fait de notre mieux
1147
-					if ($nb_close < $nb_open) {
1148
-						break;
1149
-					}
1150
-					while (
1151
-						$p = strpos($texte, $search_debut_boucle, $search_from)
1152
-						and $p < $pos_fin
1153
-					) {
1154
-						$nb_open++;
1155
-						$search_from = $p + 1;
1156
-					}
1157
-				} while ($nb_close < $nb_open and $maxiter++ < 5);
1158
-
1159
-				$pos_courante = $pos_fin + strlen($fin_boucle);
1160
-			}
1161
-			$result->milieu = substr($texte, $pos_milieu, $pos_fin - $pos_milieu);
1162
-		}
1163
-
1164
-		$ligne_suite = $ligne_apres = $ligne_debut_texte + public_compte_ligne($texte, $pos_debut_texte, $pos_courante);
1165
-		$boucle = public_trouver_fin_boucle($texte, $id_parent, $boucle, $pos_courante, $result);
1166
-
1167
-		//
1168
-		// 1. Partie conditionnelle apres ?
1169
-		//
1170
-		if ($boucle['pos_postcond']) {
1171
-			$result->apres = substr($texte, $pos_courante, $boucle['pos_postcond'] - $pos_courante);
1172
-			$ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_postcond_inside']);
1173
-			$pos_courante = $boucle['pos_postcond_inside'] ;
1174
-		}
1175
-
1176
-
1177
-		//
1178
-		// 2. Partie alternative apres ?
1179
-		//
1180
-		$ligne_altern = $ligne_suite;
1181
-		if ($boucle['pos_altern']) {
1182
-			$result->altern = substr($texte, $pos_courante, $boucle['pos_altern'] - $pos_courante);
1183
-			$ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_altern_inside']);
1184
-			$pos_courante = $boucle['pos_altern_inside'];
1185
-		}
1186
-
1187
-		//
1188
-		// 3. Partie footer non alternative ?
1189
-		//
1190
-		$ligne_postaff = $ligne_suite;
1191
-		if ($boucle['pos_postaff']) {
1192
-			$result->postaff = substr($texte, $pos_courante, $boucle['pos_postaff'] - $pos_courante);
1193
-			$ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_postaff_inside']);
1194
-			$pos_courante = $boucle['pos_postaff_inside'];
1195
-		}
1196
-
1197
-		$result->ligne = $ligne_preaff;
1198
-
1199
-		if ($p = strpos($type, ':')) {
1200
-			$result->sql_serveur = substr($type, 0, $p);
1201
-			$type = substr($type, $p + 1);
1202
-		}
1203
-		$soustype = strtolower($type);
1204
-
1205
-		if (!isset($GLOBALS['table_des_tables'][$soustype])) {
1206
-			$soustype = $type;
1207
-		}
1208
-
1209
-		$result->type_requete = $soustype;
1210
-		// Lancer la 2e passe sur les criteres si la 1ere etait bonne
1211
-		if (!is_array($result->param)) {
1212
-			$err_b = true;
1213
-		} else {
1214
-			phraser_criteres($result->param, $result);
1215
-			if (strncasecmp($soustype, TYPE_RECURSIF, strlen(TYPE_RECURSIF)) == 0) {
1216
-				$result->type_requete = TYPE_RECURSIF;
1217
-				$args = $result->param;
1218
-				array_unshift(
1219
-					$args,
1220
-					substr($type, strlen(TYPE_RECURSIF))
1221
-				);
1222
-				$result->param = $args;
1223
-			}
1224
-		}
1225
-
1226
-		$descr['id_mere_contexte'] = $id_boucle;
1227
-		$result->milieu = public_phraser_html_dist($result->milieu, $id_boucle, $boucles, $descr, $ligne_milieu, $boucle_placeholder);
1228
-		// reserver la place dans la pile des boucles pour compiler ensuite dans le bon ordre
1229
-		// ie les boucles qui apparaissent dans les partie conditionnelles doivent etre compilees apres cette boucle
1230
-		// si il y a deja une boucle de ce nom, cela declenchera une erreur ensuite
1231
-		if (empty($boucles[$id_boucle])) {
1232
-			$boucles[$id_boucle] = null;
1233
-		}
1234
-		$result->preaff = public_phraser_html_dist($result->preaff, $id_parent, $boucles, $descr, $ligne_preaff, $boucle_placeholder);
1235
-		$result->avant = public_phraser_html_dist($result->avant, $id_parent, $boucles, $descr, $ligne_avant, $boucle_placeholder);
1236
-		$result->apres = public_phraser_html_dist($result->apres, $id_parent, $boucles, $descr, $ligne_apres, $boucle_placeholder);
1237
-		$result->altern = public_phraser_html_dist($result->altern, $id_parent, $boucles, $descr, $ligne_altern, $boucle_placeholder);
1238
-		$result->postaff = public_phraser_html_dist($result->postaff, $id_parent, $boucles, $descr, $ligne_postaff, $boucle_placeholder);
1239
-
1240
-		// Prevenir le generateur de code que le squelette est faux
1241
-		if ($err_b) {
1242
-			$result->type_requete = false;
1243
-		}
1244
-
1245
-		// Verifier qu'il n'y a pas double definition
1246
-		// apres analyse des sous-parties (pas avant).
1247
-		if (!empty($boucles[$id_boucle])) {
1248
-			if ($boucles[$id_boucle]->type_requete !== false) {
1249
-				$err_b_d = [
1250
-					'zbug_erreur_boucle_double',
1251
-					['id' => $id_boucle]
1252
-				];
1253
-				erreur_squelette($err_b_d, $result);
1254
-				// Prevenir le generateur de code que le squelette est faux
1255
-				$boucles[$id_boucle]->type_requete = false;
1256
-			}
1257
-		} else {
1258
-			$boucles[$id_boucle] = $result;
1259
-		}
1260
-
1261
-		// remplacer la boucle par un placeholder qui compte le meme nombre de lignes
1262
-		$placeholder = public_generer_boucle_placeholder($id_boucle, $boucles[$id_boucle], $boucle_placeholder, $ligne_suite - $ligne_debut_texte);
1263
-		$longueur_boucle = $pos_courante - $boucle['debut_boucle'];
1264
-		$texte = substr_replace($texte, $placeholder, $boucle['debut_boucle'], $longueur_boucle);
1265
-		$pos_courante = $pos_courante - $longueur_boucle + strlen($placeholder);
1266
-
1267
-		// phraser la partie avant le debut de la boucle
1268
-		#$all_res = phraser_champs_etendus(substr($texte, $pos_debut_texte, $boucle['debut_boucle'] - $pos_debut_texte), $ligne_debut_texte, $all_res);
1269
-		#$all_res[] = &$boucles[$id_boucle];
1270
-
1271
-		$ligne_debut_texte = $ligne_suite;
1272
-		$pos_debut_texte = $pos_courante;
1273
-	}
1274
-
1275
-	$all_res = phraser_champs_etendus($texte, $ligne_debut_initial, $all_res);
1276
-
1277
-	return $all_res;
1017
+    $all_res = [];
1018
+    // definir un placholder pour les boucles dont on est sur d'avoir aucune occurence dans le squelette
1019
+    if (is_null($boucle_placeholder)) {
1020
+        do {
1021
+            $boucle_placeholder = 'BOUCLE_PLACEHOLDER_' . strtoupper(md5(uniqid()));
1022
+        } while (strpos($texte, $boucle_placeholder) !== false);
1023
+    }
1024
+
1025
+    $ligne_debut_initial = $ligne_debut_texte;
1026
+    $pos_debut_texte = 0;
1027
+    while ($boucle = public_trouver_premiere_boucle($texte, $id_parent, $descr, $pos_debut_texte)) {
1028
+        $err_b = ''; // indiquera s'il y a eu une erreur
1029
+        $result = new Boucle();
1030
+        $result->id_parent = $id_parent;
1031
+        $result->descr = $descr;
1032
+
1033
+        $pos_courante = $boucle['pos_boucle'];
1034
+        $pos_parent = $boucle['pos_parent'];
1035
+        $id_boucle_search = $id_boucle = $boucle['id_boucle'];
1036
+
1037
+        $ligne_preaff = $ligne_avant = $ligne_milieu = $ligne_debut_texte + public_compte_ligne($texte, $pos_debut_texte, $pos_parent);
1038
+
1039
+        // boucle anonyme ?
1040
+        if (!strlen($id_boucle)) {
1041
+            $id_boucle = '_anon_L' . $ligne_milieu . '_' . substr(md5('anonyme:' . $id_parent . ':' . json_encode($boucle, JSON_THROW_ON_ERROR)), 0, 8);
1042
+        }
1043
+
1044
+        $pos_debut_boucle = $pos_courante;
1045
+
1046
+        $pos_milieu = $pos_parent;
1047
+
1048
+        // Regarder si on a une partie conditionnelle avant <B_xxx>
1049
+        if ($boucle['pos_precond'] !== false) {
1050
+            $pos_debut_boucle = $boucle['pos_precond'];
1051
+
1052
+            $pos_avant = $boucle['pos_precond_inside'];
1053
+            $result->avant = substr($texte, $pos_avant, $pos_courante - $pos_avant);
1054
+            $ligne_avant = $ligne_debut_texte +  public_compte_ligne($texte, $pos_debut_texte, $pos_avant);
1055
+        }
1056
+
1057
+        // Regarder si on a une partie inconditionnelle avant <BB_xxx>
1058
+        if ($boucle['pos_preaff'] !== false) {
1059
+            $end_preaff = $pos_debut_boucle;
1060
+
1061
+            $pos_preaff = $boucle['pos_preaff_inside'];
1062
+            $result->preaff = substr($texte, $pos_preaff, $end_preaff - $pos_preaff);
1063
+            $ligne_preaff = $ligne_debut_texte +  public_compte_ligne($texte, $pos_debut_texte, $pos_preaff);
1064
+        }
1065
+
1066
+        $result->id_boucle = $id_boucle;
1067
+
1068
+        if (
1069
+            !preg_match(SPEC_BOUCLE, $texte, $match, 0, $pos_milieu)
1070
+            or ($pos_match = strpos($texte, (string) $match[0], $pos_milieu)) === false
1071
+            or $pos_match > $pos_milieu
1072
+        ) {
1073
+            $err_b = ['zbug_erreur_boucle_syntaxe', ['id' => $id_boucle]];
1074
+            erreur_squelette($err_b, $result);
1075
+
1076
+            $ligne_debut_texte += public_compte_ligne($texte, $pos_debut_texte, $pos_courante + 1);
1077
+            $pos_debut_texte = $pos_courante + 1;
1078
+            continue;
1079
+        }
1080
+
1081
+        $result->type_requete = $match[0];
1082
+        $pos_milieu += strlen($match[0]);
1083
+        $pos_courante = $pos_milieu; // on s'en sert pour compter les lignes plus precisemment
1084
+
1085
+        $type = $match[1];
1086
+        $jointures = trim($match[2]);
1087
+        $table_optionnelle = ($match[3]);
1088
+        if ($jointures) {
1089
+            // on affecte pas ici les jointures explicites, mais dans la compilation
1090
+            // ou elles seront completees des jointures declarees
1091
+            $result->jointures_explicites = $jointures;
1092
+        }
1093
+
1094
+        if ($table_optionnelle) {
1095
+            $result->table_optionnelle = $type;
1096
+        }
1097
+
1098
+        // 1ere passe sur les criteres, vu comme des arguments sans fct
1099
+        // Resultat mis dans result->param
1100
+        $pos_fin_criteres = $pos_milieu;
1101
+        phraser_args($texte, '/>', '', $all_res, $result, $pos_fin_criteres);
1102
+
1103
+        // En 2e passe result->criteres contiendra un tableau
1104
+        // pour l'instant on met le source (chaine) :
1105
+        // si elle reste ici au final, c'est qu'elle contient une erreur
1106
+        $pos_courante = $pos_fin_criteres; // on s'en sert pour compter les lignes plus precisemment
1107
+        $result->criteres = substr($texte, $pos_milieu, $pos_fin_criteres - $pos_milieu);
1108
+        $pos_milieu = $pos_fin_criteres;
1109
+
1110
+        //
1111
+        // Recuperer la fin :
1112
+        //
1113
+        if ($texte[$pos_milieu] === '/') {
1114
+            // boucle autofermante : pas de partie conditionnelle apres
1115
+            $pos_courante += 2;
1116
+            $result->milieu = '';
1117
+        } else {
1118
+            $pos_milieu += 1;
1119
+
1120
+            $fin_boucle = BALISE_FIN_BOUCLE . $id_boucle_search . '>';
1121
+            $pos_fin = strpos($texte, $fin_boucle, $pos_milieu);
1122
+            if ($pos_fin === false) {
1123
+                $err_b = [
1124
+                    'zbug_erreur_boucle_fermant',
1125
+                    ['id' => $id_boucle]
1126
+                ];
1127
+                erreur_squelette($err_b, $result);
1128
+                $pos_courante += strlen($fin_boucle);
1129
+            }
1130
+            else {
1131
+                // verifier une eventuelle imbrication d'une boucle homonyme
1132
+                // (interdite, generera une erreur plus loin, mais permet de signaler la bonne erreur)
1133
+                $search_debut_boucle = BALISE_BOUCLE . $id_boucle_search . '(';
1134
+                $search_from = $pos_milieu;
1135
+                $nb_open = 1;
1136
+                $nb_close = 1;
1137
+                $maxiter = 0;
1138
+                do {
1139
+                    while (
1140
+                        $nb_close < $nb_open
1141
+                        and $p = strpos($texte, $fin_boucle, $pos_fin + 1)
1142
+                    ) {
1143
+                        $nb_close++;
1144
+                        $pos_fin = $p;
1145
+                    }
1146
+                    // si on a pas trouve assez de boucles fermantes, sortir de la, on a fait de notre mieux
1147
+                    if ($nb_close < $nb_open) {
1148
+                        break;
1149
+                    }
1150
+                    while (
1151
+                        $p = strpos($texte, $search_debut_boucle, $search_from)
1152
+                        and $p < $pos_fin
1153
+                    ) {
1154
+                        $nb_open++;
1155
+                        $search_from = $p + 1;
1156
+                    }
1157
+                } while ($nb_close < $nb_open and $maxiter++ < 5);
1158
+
1159
+                $pos_courante = $pos_fin + strlen($fin_boucle);
1160
+            }
1161
+            $result->milieu = substr($texte, $pos_milieu, $pos_fin - $pos_milieu);
1162
+        }
1163
+
1164
+        $ligne_suite = $ligne_apres = $ligne_debut_texte + public_compte_ligne($texte, $pos_debut_texte, $pos_courante);
1165
+        $boucle = public_trouver_fin_boucle($texte, $id_parent, $boucle, $pos_courante, $result);
1166
+
1167
+        //
1168
+        // 1. Partie conditionnelle apres ?
1169
+        //
1170
+        if ($boucle['pos_postcond']) {
1171
+            $result->apres = substr($texte, $pos_courante, $boucle['pos_postcond'] - $pos_courante);
1172
+            $ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_postcond_inside']);
1173
+            $pos_courante = $boucle['pos_postcond_inside'] ;
1174
+        }
1175
+
1176
+
1177
+        //
1178
+        // 2. Partie alternative apres ?
1179
+        //
1180
+        $ligne_altern = $ligne_suite;
1181
+        if ($boucle['pos_altern']) {
1182
+            $result->altern = substr($texte, $pos_courante, $boucle['pos_altern'] - $pos_courante);
1183
+            $ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_altern_inside']);
1184
+            $pos_courante = $boucle['pos_altern_inside'];
1185
+        }
1186
+
1187
+        //
1188
+        // 3. Partie footer non alternative ?
1189
+        //
1190
+        $ligne_postaff = $ligne_suite;
1191
+        if ($boucle['pos_postaff']) {
1192
+            $result->postaff = substr($texte, $pos_courante, $boucle['pos_postaff'] - $pos_courante);
1193
+            $ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_postaff_inside']);
1194
+            $pos_courante = $boucle['pos_postaff_inside'];
1195
+        }
1196
+
1197
+        $result->ligne = $ligne_preaff;
1198
+
1199
+        if ($p = strpos($type, ':')) {
1200
+            $result->sql_serveur = substr($type, 0, $p);
1201
+            $type = substr($type, $p + 1);
1202
+        }
1203
+        $soustype = strtolower($type);
1204
+
1205
+        if (!isset($GLOBALS['table_des_tables'][$soustype])) {
1206
+            $soustype = $type;
1207
+        }
1208
+
1209
+        $result->type_requete = $soustype;
1210
+        // Lancer la 2e passe sur les criteres si la 1ere etait bonne
1211
+        if (!is_array($result->param)) {
1212
+            $err_b = true;
1213
+        } else {
1214
+            phraser_criteres($result->param, $result);
1215
+            if (strncasecmp($soustype, TYPE_RECURSIF, strlen(TYPE_RECURSIF)) == 0) {
1216
+                $result->type_requete = TYPE_RECURSIF;
1217
+                $args = $result->param;
1218
+                array_unshift(
1219
+                    $args,
1220
+                    substr($type, strlen(TYPE_RECURSIF))
1221
+                );
1222
+                $result->param = $args;
1223
+            }
1224
+        }
1225
+
1226
+        $descr['id_mere_contexte'] = $id_boucle;
1227
+        $result->milieu = public_phraser_html_dist($result->milieu, $id_boucle, $boucles, $descr, $ligne_milieu, $boucle_placeholder);
1228
+        // reserver la place dans la pile des boucles pour compiler ensuite dans le bon ordre
1229
+        // ie les boucles qui apparaissent dans les partie conditionnelles doivent etre compilees apres cette boucle
1230
+        // si il y a deja une boucle de ce nom, cela declenchera une erreur ensuite
1231
+        if (empty($boucles[$id_boucle])) {
1232
+            $boucles[$id_boucle] = null;
1233
+        }
1234
+        $result->preaff = public_phraser_html_dist($result->preaff, $id_parent, $boucles, $descr, $ligne_preaff, $boucle_placeholder);
1235
+        $result->avant = public_phraser_html_dist($result->avant, $id_parent, $boucles, $descr, $ligne_avant, $boucle_placeholder);
1236
+        $result->apres = public_phraser_html_dist($result->apres, $id_parent, $boucles, $descr, $ligne_apres, $boucle_placeholder);
1237
+        $result->altern = public_phraser_html_dist($result->altern, $id_parent, $boucles, $descr, $ligne_altern, $boucle_placeholder);
1238
+        $result->postaff = public_phraser_html_dist($result->postaff, $id_parent, $boucles, $descr, $ligne_postaff, $boucle_placeholder);
1239
+
1240
+        // Prevenir le generateur de code que le squelette est faux
1241
+        if ($err_b) {
1242
+            $result->type_requete = false;
1243
+        }
1244
+
1245
+        // Verifier qu'il n'y a pas double definition
1246
+        // apres analyse des sous-parties (pas avant).
1247
+        if (!empty($boucles[$id_boucle])) {
1248
+            if ($boucles[$id_boucle]->type_requete !== false) {
1249
+                $err_b_d = [
1250
+                    'zbug_erreur_boucle_double',
1251
+                    ['id' => $id_boucle]
1252
+                ];
1253
+                erreur_squelette($err_b_d, $result);
1254
+                // Prevenir le generateur de code que le squelette est faux
1255
+                $boucles[$id_boucle]->type_requete = false;
1256
+            }
1257
+        } else {
1258
+            $boucles[$id_boucle] = $result;
1259
+        }
1260
+
1261
+        // remplacer la boucle par un placeholder qui compte le meme nombre de lignes
1262
+        $placeholder = public_generer_boucle_placeholder($id_boucle, $boucles[$id_boucle], $boucle_placeholder, $ligne_suite - $ligne_debut_texte);
1263
+        $longueur_boucle = $pos_courante - $boucle['debut_boucle'];
1264
+        $texte = substr_replace($texte, $placeholder, $boucle['debut_boucle'], $longueur_boucle);
1265
+        $pos_courante = $pos_courante - $longueur_boucle + strlen($placeholder);
1266
+
1267
+        // phraser la partie avant le debut de la boucle
1268
+        #$all_res = phraser_champs_etendus(substr($texte, $pos_debut_texte, $boucle['debut_boucle'] - $pos_debut_texte), $ligne_debut_texte, $all_res);
1269
+        #$all_res[] = &$boucles[$id_boucle];
1270
+
1271
+        $ligne_debut_texte = $ligne_suite;
1272
+        $pos_debut_texte = $pos_courante;
1273
+    }
1274
+
1275
+    $all_res = phraser_champs_etendus($texte, $ligne_debut_initial, $all_res);
1276
+
1277
+    return $all_res;
1278 1278
 }
Please login to merge, or discard this patch.
ecrire/install/etape_ldap4.php 1 patch
Indentation   +81 added lines, -81 removed lines patch added patch discarded remove patch
@@ -11,96 +11,96 @@
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 include_spip('auth/ldap');
18 18
 
19 19
 function install_etape_ldap4_dist() {
20
-	$adresse_ldap = _request('adresse_ldap');
21
-	$login_ldap = _request('login_ldap');
22
-	$pass_ldap = _request('pass_ldap');
23
-	$port_ldap = _request('port_ldap');
24
-	$base_ldap = _request('base_ldap');
25
-	$base_ldap_text = _request('base_ldap_text');
26
-	if (!$base_ldap) {
27
-		$base_ldap = $base_ldap_text;
28
-	}
29
-
30
-	echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"');
31
-
32
-	$ldap_link = ldap_connect($adresse_ldap, $port_ldap);
33
-	@ldap_bind($ldap_link, $login_ldap, $pass_ldap);
34
-
35
-	// Essayer de verifier le chemin fourni
36
-	$r = @ldap_compare($ldap_link, $base_ldap, 'objectClass', '');
37
-	$fail = (ldap_errno($ldap_link) == 32);
38
-
39
-	if ($fail) {
40
-		echo info_etape(_T('info_chemin_acces_annuaire')),
41
-		info_progression_etape(3, 'etape_ldap', 'install/', true),
42
-			"<div class='error'><p><b>" . _T('avis_operation_echec') . '</b></p><p>' . _T('avis_chemin_invalide_1'),
43
-			' (<tt>' . spip_htmlspecialchars($base_ldap) . '</tt>) ' . _T('avis_chemin_invalide_2') . '</p></div>';
44
-	} else {
45
-		info_etape(_T('info_reglage_ldap'));
46
-		echo info_progression_etape(4, 'etape_ldap', 'install/');
47
-
48
-		$statuts = liste_statuts_ldap();
49
-		$statut_ldap = defined('_INSTALL_STATUT_LDAP')
50
-			? _INSTALL_STATUT_LDAP
51
-			: $GLOBALS['liste_des_statuts']['info_redacteurs'];
52
-
53
-
54
-		$res = install_propager(['adresse_ldap', 'port_ldap', 'login_ldap', 'pass_ldap', 'protocole_ldap', 'tls_ldap'])
55
-			. "<input type='hidden' name='etape' value='ldap5' />"
56
-			. "<input type='hidden' name='base_ldap' value='" . spip_htmlentities($base_ldap) . "' />"
57
-			. fieldset(
58
-				_T('info_statut_utilisateurs_1'),
59
-				[
60
-					'statut_ldap' => [
61
-						'label' => _T('info_statut_utilisateurs_2') . '<br />',
62
-						'valeur' => $statut_ldap,
63
-						'alternatives' => $statuts
64
-					]
65
-				]
66
-			)
67
-			. install_ldap_correspondances()
68
-			. bouton_suivant();
69
-
70
-		echo generer_form_ecrire('install', $res);
71
-	}
72
-
73
-	echo install_fin_html();
20
+    $adresse_ldap = _request('adresse_ldap');
21
+    $login_ldap = _request('login_ldap');
22
+    $pass_ldap = _request('pass_ldap');
23
+    $port_ldap = _request('port_ldap');
24
+    $base_ldap = _request('base_ldap');
25
+    $base_ldap_text = _request('base_ldap_text');
26
+    if (!$base_ldap) {
27
+        $base_ldap = $base_ldap_text;
28
+    }
29
+
30
+    echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"');
31
+
32
+    $ldap_link = ldap_connect($adresse_ldap, $port_ldap);
33
+    @ldap_bind($ldap_link, $login_ldap, $pass_ldap);
34
+
35
+    // Essayer de verifier le chemin fourni
36
+    $r = @ldap_compare($ldap_link, $base_ldap, 'objectClass', '');
37
+    $fail = (ldap_errno($ldap_link) == 32);
38
+
39
+    if ($fail) {
40
+        echo info_etape(_T('info_chemin_acces_annuaire')),
41
+        info_progression_etape(3, 'etape_ldap', 'install/', true),
42
+            "<div class='error'><p><b>" . _T('avis_operation_echec') . '</b></p><p>' . _T('avis_chemin_invalide_1'),
43
+            ' (<tt>' . spip_htmlspecialchars($base_ldap) . '</tt>) ' . _T('avis_chemin_invalide_2') . '</p></div>';
44
+    } else {
45
+        info_etape(_T('info_reglage_ldap'));
46
+        echo info_progression_etape(4, 'etape_ldap', 'install/');
47
+
48
+        $statuts = liste_statuts_ldap();
49
+        $statut_ldap = defined('_INSTALL_STATUT_LDAP')
50
+            ? _INSTALL_STATUT_LDAP
51
+            : $GLOBALS['liste_des_statuts']['info_redacteurs'];
52
+
53
+
54
+        $res = install_propager(['adresse_ldap', 'port_ldap', 'login_ldap', 'pass_ldap', 'protocole_ldap', 'tls_ldap'])
55
+            . "<input type='hidden' name='etape' value='ldap5' />"
56
+            . "<input type='hidden' name='base_ldap' value='" . spip_htmlentities($base_ldap) . "' />"
57
+            . fieldset(
58
+                _T('info_statut_utilisateurs_1'),
59
+                [
60
+                    'statut_ldap' => [
61
+                        'label' => _T('info_statut_utilisateurs_2') . '<br />',
62
+                        'valeur' => $statut_ldap,
63
+                        'alternatives' => $statuts
64
+                    ]
65
+                ]
66
+            )
67
+            . install_ldap_correspondances()
68
+            . bouton_suivant();
69
+
70
+        echo generer_form_ecrire('install', $res);
71
+    }
72
+
73
+    echo install_fin_html();
74 74
 }
75 75
 
76 76
 function liste_statuts_ldap() {
77
-	$recom = [
78
-		'info_administrateurs' => ('<b>' . _T('info_administrateur_1') . '</b> ' . _T('info_administrateur_2') . '<br />'),
79
-		'info_redacteurs' => ('<b>' . _T('info_redacteur_1') . '</b> ' . _T('info_redacteur_2') . '<br />'),
80
-		'info_visiteurs' => ('<b>' . _T('info_visiteur_1') . '</b> ' . _T('info_visiteur_2') . '<br />')
81
-	];
82
-
83
-	$res = [];
84
-	foreach ($GLOBALS['liste_des_statuts'] as $k => $v) {
85
-		if (isset($recom[$k])) {
86
-			$res[$v] = $recom[$k];
87
-		}
88
-	}
89
-
90
-	return $res;
77
+    $recom = [
78
+        'info_administrateurs' => ('<b>' . _T('info_administrateur_1') . '</b> ' . _T('info_administrateur_2') . '<br />'),
79
+        'info_redacteurs' => ('<b>' . _T('info_redacteur_1') . '</b> ' . _T('info_redacteur_2') . '<br />'),
80
+        'info_visiteurs' => ('<b>' . _T('info_visiteur_1') . '</b> ' . _T('info_visiteur_2') . '<br />')
81
+    ];
82
+
83
+    $res = [];
84
+    foreach ($GLOBALS['liste_des_statuts'] as $k => $v) {
85
+        if (isset($recom[$k])) {
86
+            $res[$v] = $recom[$k];
87
+        }
88
+    }
89
+
90
+    return $res;
91 91
 }
92 92
 
93 93
 function install_ldap_correspondances() {
94
-	$champs = [];
95
-	foreach (is_array($GLOBALS['ldap_attributes']) ? $GLOBALS['ldap_attributes'] : [] as $champ => $v) {
96
-		$nom = 'ldap_' . $champ;
97
-		$val = is_array($v) ? join(',', $v) : strval($v);
98
-		$champs[$nom] = [
99
-			'label' => _T('ldap_correspondance', ['champ' => "<tt>$champ</tt>"]) . '<br />',
100
-			'valeur' => $val
101
-		];
102
-	}
103
-
104
-	return !$champs ?
105
-		'' : fieldset(_T('ldap_correspondance_1'), $champs, '', _T('ldap_correspondance_2') . '<br /><br />');
94
+    $champs = [];
95
+    foreach (is_array($GLOBALS['ldap_attributes']) ? $GLOBALS['ldap_attributes'] : [] as $champ => $v) {
96
+        $nom = 'ldap_' . $champ;
97
+        $val = is_array($v) ? join(',', $v) : strval($v);
98
+        $champs[$nom] = [
99
+            'label' => _T('ldap_correspondance', ['champ' => "<tt>$champ</tt>"]) . '<br />',
100
+            'valeur' => $val
101
+        ];
102
+    }
103
+
104
+    return !$champs ?
105
+        '' : fieldset(_T('ldap_correspondance_1'), $champs, '', _T('ldap_correspondance_2') . '<br /><br />');
106 106
 }
Please login to merge, or discard this patch.
ecrire/install/etape_ldap3.php 1 patch
Indentation   +61 added lines, -61 removed lines patch added patch discarded remove patch
@@ -11,76 +11,76 @@
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 function install_etape_ldap3_dist() {
18
-	$info = [];
19
-	$adresse_ldap = _request('adresse_ldap');
20
-	$login_ldap = _request('login_ldap');
21
-	$pass_ldap = _request('pass_ldap');
22
-	$port_ldap = _request('port_ldap');
18
+    $info = [];
19
+    $adresse_ldap = _request('adresse_ldap');
20
+    $login_ldap = _request('login_ldap');
21
+    $pass_ldap = _request('pass_ldap');
22
+    $port_ldap = _request('port_ldap');
23 23
 
24
-	$base_ldap_text = defined('_INSTALL_BASE_LDAP')
25
-		? _INSTALL_BASE_LDAP
26
-		: 'ou=users, dc=mon-domaine, dc=com';
24
+    $base_ldap_text = defined('_INSTALL_BASE_LDAP')
25
+        ? _INSTALL_BASE_LDAP
26
+        : 'ou=users, dc=mon-domaine, dc=com';
27 27
 
28
-	echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"');
28
+    echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"');
29 29
 
30
-	echo info_etape(
31
-		_T('info_chemin_acces_1'),
32
-		info_progression_etape(3, 'etape_ldap', 'install/')
33
-	),
34
-	_T('info_chemin_acces_2');
30
+    echo info_etape(
31
+        _T('info_chemin_acces_1'),
32
+        info_progression_etape(3, 'etape_ldap', 'install/')
33
+    ),
34
+    _T('info_chemin_acces_2');
35 35
 
36
-	$ldap_link = @ldap_connect("$adresse_ldap", "$port_ldap");
37
-	if ($ldap_link) {
38
-		@ldap_bind($ldap_link, "$login_ldap", "$pass_ldap");
39
-		$result = @ldap_read($ldap_link, '', 'objectclass=*', ['namingContexts']);
40
-		$info = @ldap_get_entries($ldap_link, $result);
41
-		@ldap_close($ldap_link);
42
-	}
36
+    $ldap_link = @ldap_connect("$adresse_ldap", "$port_ldap");
37
+    if ($ldap_link) {
38
+        @ldap_bind($ldap_link, "$login_ldap", "$pass_ldap");
39
+        $result = @ldap_read($ldap_link, '', 'objectclass=*', ['namingContexts']);
40
+        $info = @ldap_get_entries($ldap_link, $result);
41
+        @ldap_close($ldap_link);
42
+    }
43 43
 
44
-	$checked = false;
45
-	$res = '';
46
-	if (is_array($info) and $info['count'] > 0) {
47
-		$res .= '<p>' . _T('info_selection_chemin_acces') . '</p>';
48
-		$res .= '<ul>';
49
-		$n = 0;
50
-		for ($i = 0; $i < $info['count']; $i++) {
51
-			$names = $info[$i]['namingcontexts'];
52
-			if (is_array($names)) {
53
-				for ($j = 0; $j < $names['count']; $j++) {
54
-					$n++;
55
-					$res .= '<li><input name="base_ldap" value="' . spip_htmlspecialchars($names[$j]) . "\" type='radio' id='tab$n'";
56
-					if (!$checked) {
57
-						$res .= ' checked="checked"';
58
-						$checked = true;
59
-					}
60
-					$res .= ' />';
61
-					$res .= "<label for='tab$n'>" . spip_htmlspecialchars($names[$j]) . "</label></li>\n";
62
-				}
63
-			}
64
-		}
65
-		$res .= '</ul>';
66
-		$res .= _T('info_ou') . ' ';
67
-	}
68
-	$res .= "<br />\n<input name=\"base_ldap\" value=\"\" type='radio' id='manuel'";
69
-	if (!$checked) {
70
-		$res .= ' checked="checked"';
71
-		$checked = true;
72
-	}
44
+    $checked = false;
45
+    $res = '';
46
+    if (is_array($info) and $info['count'] > 0) {
47
+        $res .= '<p>' . _T('info_selection_chemin_acces') . '</p>';
48
+        $res .= '<ul>';
49
+        $n = 0;
50
+        for ($i = 0; $i < $info['count']; $i++) {
51
+            $names = $info[$i]['namingcontexts'];
52
+            if (is_array($names)) {
53
+                for ($j = 0; $j < $names['count']; $j++) {
54
+                    $n++;
55
+                    $res .= '<li><input name="base_ldap" value="' . spip_htmlspecialchars($names[$j]) . "\" type='radio' id='tab$n'";
56
+                    if (!$checked) {
57
+                        $res .= ' checked="checked"';
58
+                        $checked = true;
59
+                    }
60
+                    $res .= ' />';
61
+                    $res .= "<label for='tab$n'>" . spip_htmlspecialchars($names[$j]) . "</label></li>\n";
62
+                }
63
+            }
64
+        }
65
+        $res .= '</ul>';
66
+        $res .= _T('info_ou') . ' ';
67
+    }
68
+    $res .= "<br />\n<input name=\"base_ldap\" value=\"\" type='radio' id='manuel'";
69
+    if (!$checked) {
70
+        $res .= ' checked="checked"';
71
+        $checked = true;
72
+    }
73 73
 
74
-	$res .= ' />'
75
-		. "\n<label for='manuel'>" . _T('entree_chemin_acces') . '</label> '
76
-		. "\n<fieldset>"
77
-		. "<input type='text' name='base_ldap_text' class='text' value=\"$base_ldap_text\" size='40' />"
78
-		. "\n</fieldset>"
79
-		. "\n<input type='hidden' name='etape' value='ldap4' />"
80
-		. install_propager(['adresse_ldap', 'port_ldap', 'login_ldap', 'pass_ldap', 'protocole_ldap', 'tls_ldap'])
81
-		. bouton_suivant();
74
+    $res .= ' />'
75
+        . "\n<label for='manuel'>" . _T('entree_chemin_acces') . '</label> '
76
+        . "\n<fieldset>"
77
+        . "<input type='text' name='base_ldap_text' class='text' value=\"$base_ldap_text\" size='40' />"
78
+        . "\n</fieldset>"
79
+        . "\n<input type='hidden' name='etape' value='ldap4' />"
80
+        . install_propager(['adresse_ldap', 'port_ldap', 'login_ldap', 'pass_ldap', 'protocole_ldap', 'tls_ldap'])
81
+        . bouton_suivant();
82 82
 
83
-	echo generer_form_ecrire('install', $res);
83
+    echo generer_form_ecrire('install', $res);
84 84
 
85
-	echo install_fin_html();
85
+    echo install_fin_html();
86 86
 }
Please login to merge, or discard this patch.
ecrire/install/etape_ldap1.php 1 patch
Indentation   +71 added lines, -71 removed lines patch added patch discarded remove patch
@@ -11,88 +11,88 @@
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 function install_etape_ldap1_dist() {
18
-	$adresse_ldap = defined('_INSTALL_HOST_LDAP')
19
-		? _INSTALL_HOST_LDAP
20
-		: 'localhost';
18
+    $adresse_ldap = defined('_INSTALL_HOST_LDAP')
19
+        ? _INSTALL_HOST_LDAP
20
+        : 'localhost';
21 21
 
22
-	$port_ldap = defined('_INSTALL_PORT_LDAP')
23
-		? _INSTALL_PORT_LDAP
24
-		: 389;
22
+    $port_ldap = defined('_INSTALL_PORT_LDAP')
23
+        ? _INSTALL_PORT_LDAP
24
+        : 389;
25 25
 
26
-	$tls_ldap = defined('_INSTALL_TLS_LDAP')
27
-		? _INSTALL_TLS_LDAP
28
-		: 'non';
26
+    $tls_ldap = defined('_INSTALL_TLS_LDAP')
27
+        ? _INSTALL_TLS_LDAP
28
+        : 'non';
29 29
 
30
-	$protocole_ldap = defined('_INSTALL_PROTOCOLE_LDAP')
31
-		? _INSTALL_PROTOCOLE_LDAP
32
-		: 3; // on essaie 2 en cas d'echec
30
+    $protocole_ldap = defined('_INSTALL_PROTOCOLE_LDAP')
31
+        ? _INSTALL_PROTOCOLE_LDAP
32
+        : 3; // on essaie 2 en cas d'echec
33 33
 
34
-	$login_ldap = defined('_INSTALL_USER_LDAP')
35
-		? _INSTALL_USER_LDAP
36
-		: '';
34
+    $login_ldap = defined('_INSTALL_USER_LDAP')
35
+        ? _INSTALL_USER_LDAP
36
+        : '';
37 37
 
38
-	$pass_ldap = defined('_INSTALL_PASS_LDAP')
39
-		? _INSTALL_PASS_LDAP
40
-		: '';
38
+    $pass_ldap = defined('_INSTALL_PASS_LDAP')
39
+        ? _INSTALL_PASS_LDAP
40
+        : '';
41 41
 
42
-	echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"');
42
+    echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"');
43 43
 
44
-	echo info_etape(
45
-		_T('titre_connexion_ldap'),
46
-		info_progression_etape(1, 'etape_ldap', 'install/')
47
-	);
44
+    echo info_etape(
45
+        _T('titre_connexion_ldap'),
46
+        info_progression_etape(1, 'etape_ldap', 'install/')
47
+    );
48 48
 
49
-	echo generer_form_ecrire('install', (
50
-		"\n<input type='hidden' name='etape' value='ldap2' />"
51
-		. fieldset(
52
-			_T('entree_adresse_annuaire'),
53
-			[
54
-				'adresse_ldap' => [
55
-					'label' => _T('texte_adresse_annuaire_1'),
56
-					'valeur' => $adresse_ldap
57
-				],
58
-				'port_ldap' => [
59
-					'label' => _T('entree_port_annuaire') . '<br />' . _T('texte_port_annuaire'),
60
-					'valeur' => $port_ldap
61
-				],
62
-				'tls_ldap' => [
63
-					'label' => '<b>' . _T('tls_ldap') . '</b>',
64
-					'valeur' => $tls_ldap,
65
-					'alternatives' => [
66
-						'non' => _T('item_non'),
67
-						'oui' => _T('item_oui')
68
-					]
69
-				],
70
-				'protocole_ldap' => [
71
-					'label' => _T('protocole_ldap'),
72
-					'valeur' => $protocole_ldap,
73
-					'alternatives' => [
74
-						'3' => '3',
75
-						'2' => '2'
76
-					]
77
-				]
78
-			]
79
-		)
49
+    echo generer_form_ecrire('install', (
50
+        "\n<input type='hidden' name='etape' value='ldap2' />"
51
+        . fieldset(
52
+            _T('entree_adresse_annuaire'),
53
+            [
54
+                'adresse_ldap' => [
55
+                    'label' => _T('texte_adresse_annuaire_1'),
56
+                    'valeur' => $adresse_ldap
57
+                ],
58
+                'port_ldap' => [
59
+                    'label' => _T('entree_port_annuaire') . '<br />' . _T('texte_port_annuaire'),
60
+                    'valeur' => $port_ldap
61
+                ],
62
+                'tls_ldap' => [
63
+                    'label' => '<b>' . _T('tls_ldap') . '</b>',
64
+                    'valeur' => $tls_ldap,
65
+                    'alternatives' => [
66
+                        'non' => _T('item_non'),
67
+                        'oui' => _T('item_oui')
68
+                    ]
69
+                ],
70
+                'protocole_ldap' => [
71
+                    'label' => _T('protocole_ldap'),
72
+                    'valeur' => $protocole_ldap,
73
+                    'alternatives' => [
74
+                        '3' => '3',
75
+                        '2' => '2'
76
+                    ]
77
+                ]
78
+            ]
79
+        )
80 80
 
81
-		. "\n<p>" . _T('texte_acces_ldap_anonyme_1') . '</p>'
82
-		. fieldset(
83
-			_T('connexion_ldap'),
84
-			[
85
-				'login_ldap' => [
86
-					'label' => _T('texte_login_ldap_1'),
87
-					'valeur' => $login_ldap
88
-				],
89
-				'pass_ldap' => [
90
-					'label' => _T('entree_passe_ldap'),
91
-					'valeur' => $pass_ldap
92
-				]
93
-			]
94
-		)
95
-		. bouton_suivant()));
81
+        . "\n<p>" . _T('texte_acces_ldap_anonyme_1') . '</p>'
82
+        . fieldset(
83
+            _T('connexion_ldap'),
84
+            [
85
+                'login_ldap' => [
86
+                    'label' => _T('texte_login_ldap_1'),
87
+                    'valeur' => $login_ldap
88
+                ],
89
+                'pass_ldap' => [
90
+                    'label' => _T('entree_passe_ldap'),
91
+                    'valeur' => $pass_ldap
92
+                ]
93
+            ]
94
+        )
95
+        . bouton_suivant()));
96 96
 
97
-	echo install_fin_html();
97
+    echo install_fin_html();
98 98
 }
Please login to merge, or discard this patch.
ecrire/install/etape_2.php 1 patch
Indentation   +121 added lines, -121 removed lines patch added patch discarded remove patch
@@ -11,166 +11,166 @@
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 include_spip('base/abstract_sql');
18 18
 
19 19
 function install_etape_2_dist() {
20
-	$adresse_db = defined('_INSTALL_HOST_DB')
21
-		? _INSTALL_HOST_DB
22
-		: _request('adresse_db');
20
+    $adresse_db = defined('_INSTALL_HOST_DB')
21
+        ? _INSTALL_HOST_DB
22
+        : _request('adresse_db');
23 23
 
24
-	if (preg_match(',(.*):(.*),', $adresse_db, $r)) {
25
-		[, $adresse_db, $port] = $r;
26
-	} else {
27
-		$port = '';
28
-	}
24
+    if (preg_match(',(.*):(.*),', $adresse_db, $r)) {
25
+        [, $adresse_db, $port] = $r;
26
+    } else {
27
+        $port = '';
28
+    }
29 29
 
30
-	$login_db = defined('_INSTALL_USER_DB')
31
-		? _INSTALL_USER_DB
32
-		: _request('login_db');
30
+    $login_db = defined('_INSTALL_USER_DB')
31
+        ? _INSTALL_USER_DB
32
+        : _request('login_db');
33 33
 
34
-	$pass_db = defined('_INSTALL_PASS_DB')
35
-		? _INSTALL_PASS_DB
36
-		: _request('pass_db');
34
+    $pass_db = defined('_INSTALL_PASS_DB')
35
+        ? _INSTALL_PASS_DB
36
+        : _request('pass_db');
37 37
 
38
-	$server_db = defined('_INSTALL_SERVER_DB')
39
-		? _INSTALL_SERVER_DB
40
-		: _request('server_db');
38
+    $server_db = defined('_INSTALL_SERVER_DB')
39
+        ? _INSTALL_SERVER_DB
40
+        : _request('server_db');
41 41
 
42
-	$name_db = defined('_INSTALL_NAME_DB')
43
-		? _INSTALL_NAME_DB
44
-		: '';
42
+    $name_db = defined('_INSTALL_NAME_DB')
43
+        ? _INSTALL_NAME_DB
44
+        : '';
45 45
 
46
-	$chmod = _request('chmod');
46
+    $chmod = _request('chmod');
47 47
 
48
-	$link = spip_connect_db($adresse_db, $port, $login_db, $pass_db, $name_db, $server_db);
49
-	$GLOBALS['connexions'][$server_db] = $link;
48
+    $link = spip_connect_db($adresse_db, $port, $login_db, $pass_db, $name_db, $server_db);
49
+    $GLOBALS['connexions'][$server_db] = $link;
50 50
 
51
-	$GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']]
52
-		= $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']];
51
+    $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']]
52
+        = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']];
53 53
 
54
-	echo install_debut_html();
54
+    echo install_debut_html();
55 55
 
56 56
 // prenons toutes les dispositions possibles pour que rien ne s'affiche !
57 57
 
58
-	/*
58
+    /*
59 59
 	 * /!\ sqlite3/PDO : erreur sur join(', ', $link)
60 60
 	 * L'objet PDO ne peut pas etre transformee en chaine
61 61
 	 * Un echo $link ne fonctionne pas non plus
62 62
 	 * Il faut utiliser par exemple print_r($link)
63 63
 	 */
64
-	//echo "\n<!--\n", join(', ', $link), " $login_db ";
65
-	$db_connect = 0; // revoirfunction_exists($ferrno) ? $ferrno() : 0;
66
-	//echo join(', ', $GLOBALS['connexions'][$server_db]);
67
-	//echo "\n-->\n";
64
+    //echo "\n<!--\n", join(', ', $link), " $login_db ";
65
+    $db_connect = 0; // revoirfunction_exists($ferrno) ? $ferrno() : 0;
66
+    //echo join(', ', $GLOBALS['connexions'][$server_db]);
67
+    //echo "\n-->\n";
68 68
 
69
-	if (($db_connect == '0') && $link) {
70
-		echo "<div class='success'><b>" . _T('info_connexion_ok') . '</b></div>';
71
-		echo info_progression_etape(2, 'etape_', 'install/');
69
+    if (($db_connect == '0') && $link) {
70
+        echo "<div class='success'><b>" . _T('info_connexion_ok') . '</b></div>';
71
+        echo info_progression_etape(2, 'etape_', 'install/');
72 72
 
73
-		echo info_etape(_T('menu_aide_installation_choix_base') . aider('install2', true));
73
+        echo info_etape(_T('menu_aide_installation_choix_base') . aider('install2', true));
74 74
 
75
-		echo "\n", '<!-- ', sql_version($server_db), ' -->';
76
-		[$checked, $res] = install_etape_2_bases($login_db, $server_db);
75
+        echo "\n", '<!-- ', sql_version($server_db), ' -->';
76
+        [$checked, $res] = install_etape_2_bases($login_db, $server_db);
77 77
 
78
-		$hidden = (defined('_SPIP_CHMOD')
79
-				? ''
80
-				: ("\n<input type='hidden' name='chmod' value='" . spip_htmlspecialchars($chmod) . "' />"))
81
-			. predef_ou_cache($adresse_db . ($port ? ':' . $port : ''), $login_db, $pass_db, $server_db);
78
+        $hidden = (defined('_SPIP_CHMOD')
79
+                ? ''
80
+                : ("\n<input type='hidden' name='chmod' value='" . spip_htmlspecialchars($chmod) . "' />"))
81
+            . predef_ou_cache($adresse_db . ($port ? ':' . $port : ''), $login_db, $pass_db, $server_db);
82 82
 
83
-		echo install_etape_2_form($hidden, $checked, $res, 3);
84
-	} else {
85
-		echo info_progression_etape(1, 'etape_', 'install/', true);
83
+        echo install_etape_2_form($hidden, $checked, $res, 3);
84
+    } else {
85
+        echo info_progression_etape(1, 'etape_', 'install/', true);
86 86
 
87
-		echo "<div class='error'>";
88
-		echo info_etape(_T('info_connexion_base'));
89
-		echo '<h3>' . _T('avis_connexion_echec_1') . '</h3>';
90
-		echo '<p>' . _T('avis_connexion_echec_2') . '</p>';
87
+        echo "<div class='error'>";
88
+        echo info_etape(_T('info_connexion_base'));
89
+        echo '<h3>' . _T('avis_connexion_echec_1') . '</h3>';
90
+        echo '<p>' . _T('avis_connexion_echec_2') . '</p>';
91 91
 
92
-		echo "<p style='font-size: small;'>",
93
-		_T('avis_connexion_echec_3'),
94
-		'</p></div>';
95
-	}
92
+        echo "<p style='font-size: small;'>",
93
+        _T('avis_connexion_echec_3'),
94
+        '</p></div>';
95
+    }
96 96
 
97
-	echo install_fin_html();
97
+    echo install_fin_html();
98 98
 }
99 99
 
100 100
 // Liste les bases accessibles,
101 101
 // avec une heuristique pour preselectionner la plus probable
102 102
 
103 103
 function install_etape_2_bases($login_db, $server_db) {
104
-	$res = install_etape_liste_bases($server_db, $login_db);
105
-	if ($res) {
106
-		[$checked, $bases] = $res;
107
-
108
-		return [
109
-			$checked,
110
-			"<label for='choix_db'><b>"
111
-			. _T('texte_choix_base_2')
112
-			. '</b><br />'
113
-			. _T('texte_choix_base_3')
114
-			. '</label>'
115
-			. "<ul>\n<li>"
116
-			. join("</li>\n<li>", $bases)
117
-			. "</li>\n</ul><p>"
118
-			. _T('info_ou')
119
-			. ' '
120
-		];
121
-	}
122
-	$res = '<b>' . _T('avis_lecture_noms_bases_1') . '</b>
104
+    $res = install_etape_liste_bases($server_db, $login_db);
105
+    if ($res) {
106
+        [$checked, $bases] = $res;
107
+
108
+        return [
109
+            $checked,
110
+            "<label for='choix_db'><b>"
111
+            . _T('texte_choix_base_2')
112
+            . '</b><br />'
113
+            . _T('texte_choix_base_3')
114
+            . '</label>'
115
+            . "<ul>\n<li>"
116
+            . join("</li>\n<li>", $bases)
117
+            . "</li>\n</ul><p>"
118
+            . _T('info_ou')
119
+            . ' '
120
+        ];
121
+    }
122
+    $res = '<b>' . _T('avis_lecture_noms_bases_1') . '</b>
123 123
 		' . _T('avis_lecture_noms_bases_2') . '<p>';
124 124
 
125
-	$checked = false;
126
-	if ($login_db) {
127
-		// Si un login comporte un point, le nom de la base est plus
128
-		// probablement le login sans le point -- testons pour savoir
129
-		$test_base = $login_db;
130
-		$ok = sql_selectdb($test_base, $server_db);
131
-		$test_base2 = str_replace('.', '_', $test_base);
132
-		if (sql_selectdb($test_base2, $server_db)) {
133
-			$test_base = $test_base2;
134
-			$ok = true;
135
-		}
136
-
137
-		if ($ok) {
138
-			$res .= _T('avis_lecture_noms_bases_3')
139
-				. '<ul>'
140
-				. '<li><input name="choix_db" value="' . $test_base . "\" type='radio' id='stand' checked='checked' />"
141
-				. "<label for='stand'>" . $test_base . "</label></li>\n"
142
-				. '</ul>'
143
-				. '<p>' . _T('info_ou') . ' ';
144
-			$checked = true;
145
-		}
146
-	}
147
-
148
-	return [$checked, $res];
125
+    $checked = false;
126
+    if ($login_db) {
127
+        // Si un login comporte un point, le nom de la base est plus
128
+        // probablement le login sans le point -- testons pour savoir
129
+        $test_base = $login_db;
130
+        $ok = sql_selectdb($test_base, $server_db);
131
+        $test_base2 = str_replace('.', '_', $test_base);
132
+        if (sql_selectdb($test_base2, $server_db)) {
133
+            $test_base = $test_base2;
134
+            $ok = true;
135
+        }
136
+
137
+        if ($ok) {
138
+            $res .= _T('avis_lecture_noms_bases_3')
139
+                . '<ul>'
140
+                . '<li><input name="choix_db" value="' . $test_base . "\" type='radio' id='stand' checked='checked' />"
141
+                . "<label for='stand'>" . $test_base . "</label></li>\n"
142
+                . '</ul>'
143
+                . '<p>' . _T('info_ou') . ' ';
144
+            $checked = true;
145
+        }
146
+    }
147
+
148
+    return [$checked, $res];
149 149
 }
150 150
 
151 151
 function install_etape_2_form($hidden, $checked, $res, $etape) {
152
-	return generer_form_ecrire('install', (
153
-		"\n<input type='hidden' name='etape' value='$etape' />"
154
-		. $hidden
155
-		. (defined('_INSTALL_NAME_DB')
156
-			? '<h3>' . _T('install_nom_base_hebergeur') . ' <tt>' . _INSTALL_NAME_DB . '</tt>' . '</h3>'
157
-			: "\n<fieldset><legend>" . _T('texte_choix_base_1') . "</legend>\n"
158
-			. $res
159
-			. "\n<input name=\"choix_db\" value=\"new_spip\" type='radio' id='nou'"
160
-			. ($checked ? '' : " checked='checked'")
161
-			. " />\n<label for='nou'>" . _T('info_creer_base') . "</label></p>\n<p>"
162
-			. "\n<input type='text' name='table_new' class='text' value=\"spip\" size='20' /></p></fieldset>\n"
163
-		)
164
-
165
-		. ((defined('_INSTALL_TABLE_PREFIX')
166
-			or $GLOBALS['table_prefix'] != 'spip')
167
-			? '<h3>' . _T('install_table_prefix_hebergeur') . '  <tt>' . $GLOBALS['table_prefix'] . '</tt>' . '</h3>'
168
-			: '<fieldset><legend>' . _T('texte_choix_table_prefix') . "</legend>\n"
169
-			. "<p><label for='table_prefix'>" . _T('info_table_prefix') . '</label></p><p>'
170
-			. "\n<input type='text' id='tprefix' name='tprefix' class='text' value='"
171
-			. 'spip' # valeur par defaut
172
-			. "' size='20' /></p></fieldset>"
173
-		)
174
-
175
-		. bouton_suivant()));
152
+    return generer_form_ecrire('install', (
153
+        "\n<input type='hidden' name='etape' value='$etape' />"
154
+        . $hidden
155
+        . (defined('_INSTALL_NAME_DB')
156
+            ? '<h3>' . _T('install_nom_base_hebergeur') . ' <tt>' . _INSTALL_NAME_DB . '</tt>' . '</h3>'
157
+            : "\n<fieldset><legend>" . _T('texte_choix_base_1') . "</legend>\n"
158
+            . $res
159
+            . "\n<input name=\"choix_db\" value=\"new_spip\" type='radio' id='nou'"
160
+            . ($checked ? '' : " checked='checked'")
161
+            . " />\n<label for='nou'>" . _T('info_creer_base') . "</label></p>\n<p>"
162
+            . "\n<input type='text' name='table_new' class='text' value=\"spip\" size='20' /></p></fieldset>\n"
163
+        )
164
+
165
+        . ((defined('_INSTALL_TABLE_PREFIX')
166
+            or $GLOBALS['table_prefix'] != 'spip')
167
+            ? '<h3>' . _T('install_table_prefix_hebergeur') . '  <tt>' . $GLOBALS['table_prefix'] . '</tt>' . '</h3>'
168
+            : '<fieldset><legend>' . _T('texte_choix_table_prefix') . "</legend>\n"
169
+            . "<p><label for='table_prefix'>" . _T('info_table_prefix') . '</label></p><p>'
170
+            . "\n<input type='text' id='tprefix' name='tprefix' class='text' value='"
171
+            . 'spip' # valeur par defaut
172
+            . "' size='20' /></p></fieldset>"
173
+        )
174
+
175
+        . bouton_suivant()));
176 176
 }
Please login to merge, or discard this patch.
ecrire/install/etape_ldap2.php 1 patch
Indentation   +57 added lines, -57 removed lines patch added patch discarded remove patch
@@ -11,76 +11,76 @@
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 function install_etape_ldap2_dist() {
18
-	echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"');
18
+    echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"');
19 19
 
20
-	$adresse_ldap = _request('adresse_ldap');
20
+    $adresse_ldap = _request('adresse_ldap');
21 21
 
22
-	$port_ldap = _request('port_ldap');
22
+    $port_ldap = _request('port_ldap');
23 23
 
24
-	$tls_ldap = _request('tls_ldap');
24
+    $tls_ldap = _request('tls_ldap');
25 25
 
26
-	$protocole_ldap = _request('protocole_ldap');
26
+    $protocole_ldap = _request('protocole_ldap');
27 27
 
28
-	$login_ldap = _request('login_ldap');
28
+    $login_ldap = _request('login_ldap');
29 29
 
30
-	$pass_ldap = _request('pass_ldap');
30
+    $pass_ldap = _request('pass_ldap');
31 31
 
32
-	$port_ldap = intval($port_ldap);
32
+    $port_ldap = intval($port_ldap);
33 33
 
34
-	$tls = false;
34
+    $tls = false;
35 35
 
36
-	if ($tls_ldap == 'oui') {
37
-		if ($port_ldap == 636) {
38
-			$adresse_ldap = "ldaps://$adresse_ldap";
39
-		} else {
40
-			$tls = true;
41
-		}
42
-	}
43
-	$ldap_link = ldap_connect($adresse_ldap, $port_ldap);
44
-	$erreur = "ldap_connect($adresse_ldap, $port_ldap)";
36
+    if ($tls_ldap == 'oui') {
37
+        if ($port_ldap == 636) {
38
+            $adresse_ldap = "ldaps://$adresse_ldap";
39
+        } else {
40
+            $tls = true;
41
+        }
42
+    }
43
+    $ldap_link = ldap_connect($adresse_ldap, $port_ldap);
44
+    $erreur = "ldap_connect($adresse_ldap, $port_ldap)";
45 45
 
46
-	if ($ldap_link) {
47
-		if (!ldap_set_option($ldap_link, LDAP_OPT_PROTOCOL_VERSION, $protocole_ldap)) {
48
-			$protocole_ldap = 2;
49
-			ldap_set_option($ldap_link, LDAP_OPT_PROTOCOL_VERSION, $protocole_ldap);
50
-		}
51
-		if ($tls === true) {
52
-			if (!ldap_start_tls($ldap_link)) {
53
-				$erreur = "ldap_start_tls($ldap_link) $adresse_ldap, $port_ldap";
54
-				$ldap_link = false;
55
-			}
56
-		}
57
-		if ($ldap_link) {
58
-			$ldap_link = ldap_bind($ldap_link, $login_ldap, $pass_ldap);
59
-			$erreur = "ldap_bind('$ldap_link', '$login_ldap', '$pass_ldap'): $adresse_ldap, $port_ldap";
60
-		}
61
-	}
46
+    if ($ldap_link) {
47
+        if (!ldap_set_option($ldap_link, LDAP_OPT_PROTOCOL_VERSION, $protocole_ldap)) {
48
+            $protocole_ldap = 2;
49
+            ldap_set_option($ldap_link, LDAP_OPT_PROTOCOL_VERSION, $protocole_ldap);
50
+        }
51
+        if ($tls === true) {
52
+            if (!ldap_start_tls($ldap_link)) {
53
+                $erreur = "ldap_start_tls($ldap_link) $adresse_ldap, $port_ldap";
54
+                $ldap_link = false;
55
+            }
56
+        }
57
+        if ($ldap_link) {
58
+            $ldap_link = ldap_bind($ldap_link, $login_ldap, $pass_ldap);
59
+            $erreur = "ldap_bind('$ldap_link', '$login_ldap', '$pass_ldap'): $adresse_ldap, $port_ldap";
60
+        }
61
+    }
62 62
 
63
-	if ($ldap_link) {
64
-		echo info_etape(
65
-			_T('titre_connexion_ldap'),
66
-			info_progression_etape(2, 'etape_ldap', 'install/')
67
-		),  _T('info_connexion_ldap_ok');
68
-		echo generer_form_ecrire('install', (
69
-			"\n<input type='hidden' name='etape' value='ldap3' />"
70
-			. "\n<input type='hidden' name='adresse_ldap' value=\"$adresse_ldap\" />"
71
-			. "\n<input type='hidden' name='port_ldap' value=\"$port_ldap\" />"
72
-			. "\n<input type='hidden' name='login_ldap' value=\"$login_ldap\" />"
73
-			. "\n<input type='hidden' name='pass_ldap' value=\"$pass_ldap\" />"
74
-			. "\n<input type='hidden' name='protocole_ldap' value=\"$protocole_ldap\" />"
75
-			. "\n<input type='hidden' name='tls_ldap' value=\"$tls_ldap\" />"
76
-			. bouton_suivant()));
77
-	} else {
78
-		echo info_etape(_T('titre_connexion_ldap')), info_progression_etape(1, 'etape_ldap', 'install/', true),
79
-			"<div class='error'><p>" . _T('avis_connexion_ldap_echec_1') . '</p>',
80
-			'<p>' . _T('avis_connexion_ldap_echec_2') .
81
-			"<br />\n" . _T('avis_connexion_ldap_echec_3') .
82
-			'<br /><br />' . $erreur . '<b> ?</b></p></div>';
83
-	}
63
+    if ($ldap_link) {
64
+        echo info_etape(
65
+            _T('titre_connexion_ldap'),
66
+            info_progression_etape(2, 'etape_ldap', 'install/')
67
+        ),  _T('info_connexion_ldap_ok');
68
+        echo generer_form_ecrire('install', (
69
+            "\n<input type='hidden' name='etape' value='ldap3' />"
70
+            . "\n<input type='hidden' name='adresse_ldap' value=\"$adresse_ldap\" />"
71
+            . "\n<input type='hidden' name='port_ldap' value=\"$port_ldap\" />"
72
+            . "\n<input type='hidden' name='login_ldap' value=\"$login_ldap\" />"
73
+            . "\n<input type='hidden' name='pass_ldap' value=\"$pass_ldap\" />"
74
+            . "\n<input type='hidden' name='protocole_ldap' value=\"$protocole_ldap\" />"
75
+            . "\n<input type='hidden' name='tls_ldap' value=\"$tls_ldap\" />"
76
+            . bouton_suivant()));
77
+    } else {
78
+        echo info_etape(_T('titre_connexion_ldap')), info_progression_etape(1, 'etape_ldap', 'install/', true),
79
+            "<div class='error'><p>" . _T('avis_connexion_ldap_echec_1') . '</p>',
80
+            '<p>' . _T('avis_connexion_ldap_echec_2') .
81
+            "<br />\n" . _T('avis_connexion_ldap_echec_3') .
82
+            '<br /><br />' . $erreur . '<b> ?</b></p></div>';
83
+    }
84 84
 
85
-	echo install_fin_html();
85
+    echo install_fin_html();
86 86
 }
Please login to merge, or discard this patch.
ecrire/install/etape_4.php 1 patch
Indentation   +49 added lines, -49 removed lines patch added patch discarded remove patch
@@ -11,69 +11,69 @@
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 include_spip('inc/headers');
18 18
 
19 19
 function install_etape_4_dist() {
20 20
 
21
-	// creer le repertoire cache, qui sert partout !
22
-	if (!@file_exists(_DIR_CACHE)) {
23
-		$rep = preg_replace(',' . _DIR_TMP . ',', '', _DIR_CACHE);
24
-		$rep = sous_repertoire(_DIR_TMP, $rep, true, true);
25
-	}
21
+    // creer le repertoire cache, qui sert partout !
22
+    if (!@file_exists(_DIR_CACHE)) {
23
+        $rep = preg_replace(',' . _DIR_TMP . ',', '', _DIR_CACHE);
24
+        $rep = sous_repertoire(_DIR_TMP, $rep, true, true);
25
+    }
26 26
 
27 27
 
28
-	echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"');
29
-	echo info_progression_etape(4, 'etape_', 'install/');
28
+    echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"');
29
+    echo info_progression_etape(4, 'etape_', 'install/');
30 30
 
31
-	echo "<div class='success'><b>"
32
-		. _T('info_derniere_etape')
33
-		. '</b><p>'
34
-		. _T('info_utilisation_spip')
35
-		. '</p></div>';
31
+    echo "<div class='success'><b>"
32
+        . _T('info_derniere_etape')
33
+        . '</b><p>'
34
+        . _T('info_utilisation_spip')
35
+        . '</p></div>';
36 36
 
37 37
 
38
-	echo '<p>'
39
-		. _T(
40
-			'plugin_info_plugins_dist_1',
41
-			['plugins_dist' => '<tt>' . joli_repertoire(_DIR_PLUGINS_DIST) . '</tt>']
42
-		)
43
-		. '</p>';
38
+    echo '<p>'
39
+        . _T(
40
+            'plugin_info_plugins_dist_1',
41
+            ['plugins_dist' => '<tt>' . joli_repertoire(_DIR_PLUGINS_DIST) . '</tt>']
42
+        )
43
+        . '</p>';
44 44
 
45
-	// installer les extensions
46
-	include_spip('inc/plugin');
47
-	$afficher = charger_fonction('afficher_liste', 'plugins');
48
-	echo $afficher(
49
-		self(),
50
-		liste_plugin_files(_DIR_PLUGINS_DIST),
51
-		[],
52
-		[],
53
-		_DIR_PLUGINS_DIST,
54
-		'afficher_nom_plugin'
55
-	);
45
+    // installer les extensions
46
+    include_spip('inc/plugin');
47
+    $afficher = charger_fonction('afficher_liste', 'plugins');
48
+    echo $afficher(
49
+        self(),
50
+        liste_plugin_files(_DIR_PLUGINS_DIST),
51
+        [],
52
+        [],
53
+        _DIR_PLUGINS_DIST,
54
+        'afficher_nom_plugin'
55
+    );
56 56
 
57
-	// si la base de SPIP est up, on peut installer les plugins, sinon on passe cette etape
58
-	// car les plugins supposent que la base de SPIP est dans son etat normal (mise a jour)
59
-	// au premier passage dans l'espace prive on aura une demande d'upgrade qui se poursuit sur la page plugin
60
-	// et procede alors a l'installation
61
-	if (
62
-		!isset($GLOBALS['meta']['version_installee'])
63
-		or ($GLOBALS['spip_version_base'] == (str_replace(',', '.', $GLOBALS['meta']['version_installee'])))
64
-	) {
65
-		plugin_installes_meta();
66
-	}
57
+    // si la base de SPIP est up, on peut installer les plugins, sinon on passe cette etape
58
+    // car les plugins supposent que la base de SPIP est dans son etat normal (mise a jour)
59
+    // au premier passage dans l'espace prive on aura une demande d'upgrade qui se poursuit sur la page plugin
60
+    // et procede alors a l'installation
61
+    if (
62
+        !isset($GLOBALS['meta']['version_installee'])
63
+        or ($GLOBALS['spip_version_base'] == (str_replace(',', '.', $GLOBALS['meta']['version_installee'])))
64
+    ) {
65
+        plugin_installes_meta();
66
+    }
67 67
 
68
-	// mettre a jour si necessaire l'adresse du site
69
-	// securite si on arrive plus a se loger
70
-	include_spip('inc/config');
71
-	appliquer_adresse_site('');
68
+    // mettre a jour si necessaire l'adresse du site
69
+    // securite si on arrive plus a se loger
70
+    include_spip('inc/config');
71
+    appliquer_adresse_site('');
72 72
 
73
-	// aller a la derniere etape qui clos l'install et redirige
74
-	$suite = "\n<input type='hidden' name='etape' value='fin' />"
75
-		. bouton_suivant(_T('login_espace_prive'));
73
+    // aller a la derniere etape qui clos l'install et redirige
74
+    $suite = "\n<input type='hidden' name='etape' value='fin' />"
75
+        . bouton_suivant(_T('login_espace_prive'));
76 76
 
77
-	echo generer_form_ecrire('install', $suite);
78
-	echo install_fin_html();
77
+    echo generer_form_ecrire('install', $suite);
78
+    echo install_fin_html();
79 79
 }
Please login to merge, or discard this patch.