Completed
Push — master ( fdca64...241762 )
by cam
02:05
created
ecrire/public/decompiler.php 1 patch
Indentation   +176 added lines, -176 removed lines patch added patch discarded remove patch
@@ -12,129 +12,129 @@  discard block
 block discarded – undo
12 12
 \***************************************************************************/
13 13
 
14 14
 if (!defined('_ECRIRE_INC_VERSION')) {
15
-	return;
15
+    return;
16 16
 }
17 17
 
18 18
 // Decompilation de l'arbre de syntaxe abstraite d'un squelette SPIP
19 19
 
20 20
 function decompiler_boucle($struct, $fmt = '', $prof = 0) {
21
-	$nom = $struct->id_boucle;
22
-	$preaff = decompiler_($struct->preaff, $fmt, $prof);
23
-	$avant = decompiler_($struct->avant, $fmt, $prof);
24
-	$apres = decompiler_($struct->apres, $fmt, $prof);
25
-	$altern = decompiler_($struct->altern, $fmt, $prof);
26
-	$milieu = decompiler_($struct->milieu, $fmt, $prof);
27
-	$postaff = decompiler_($struct->postaff, $fmt, $prof);
28
-
29
-	$type = $struct->sql_serveur ? "$struct->sql_serveur:" : '';
30
-	$type .= ($struct->type_requete ?: $struct->type_table_optionnelle);
31
-
32
-	if ($struct->jointures_explicites) {
33
-		$type .= ' ' . $struct->jointures_explicites;
34
-	}
35
-	if ($struct->table_optionnelle) {
36
-		$type .= '?';
37
-	}
38
-	// Revoir le cas de la boucle recursive
39
-
40
-	$crit = $struct->param;
41
-	if ($crit && !is_array($crit[0])) {
42
-		$type = strtolower($type) . array_shift($crit);
43
-	}
44
-	$crit = decompiler_criteres($struct, $fmt, $prof);
45
-
46
-	$f = 'format_boucle_' . $fmt;
47
-
48
-	return $f($preaff, $avant, $nom, $type, $crit, $milieu, $apres, $altern, $postaff, $prof);
21
+    $nom = $struct->id_boucle;
22
+    $preaff = decompiler_($struct->preaff, $fmt, $prof);
23
+    $avant = decompiler_($struct->avant, $fmt, $prof);
24
+    $apres = decompiler_($struct->apres, $fmt, $prof);
25
+    $altern = decompiler_($struct->altern, $fmt, $prof);
26
+    $milieu = decompiler_($struct->milieu, $fmt, $prof);
27
+    $postaff = decompiler_($struct->postaff, $fmt, $prof);
28
+
29
+    $type = $struct->sql_serveur ? "$struct->sql_serveur:" : '';
30
+    $type .= ($struct->type_requete ?: $struct->type_table_optionnelle);
31
+
32
+    if ($struct->jointures_explicites) {
33
+        $type .= ' ' . $struct->jointures_explicites;
34
+    }
35
+    if ($struct->table_optionnelle) {
36
+        $type .= '?';
37
+    }
38
+    // Revoir le cas de la boucle recursive
39
+
40
+    $crit = $struct->param;
41
+    if ($crit && !is_array($crit[0])) {
42
+        $type = strtolower($type) . array_shift($crit);
43
+    }
44
+    $crit = decompiler_criteres($struct, $fmt, $prof);
45
+
46
+    $f = 'format_boucle_' . $fmt;
47
+
48
+    return $f($preaff, $avant, $nom, $type, $crit, $milieu, $apres, $altern, $postaff, $prof);
49 49
 }
50 50
 
51 51
 function decompiler_include($struct, $fmt = '', $prof = 0) {
52
-	$res = [];
53
-	foreach ($struct->param ?: [] as $couple) {
54
-		array_shift($couple);
55
-		foreach ($couple as $v) {
56
-			$res[] = decompiler_($v, $fmt, $prof);
57
-		}
58
-	}
59
-	$file = is_string($struct->texte) ? $struct->texte :
60
-		decompiler_($struct->texte, $fmt, $prof);
61
-	$f = 'format_inclure_' . $fmt;
62
-
63
-	return $f($file, $res, $prof);
52
+    $res = [];
53
+    foreach ($struct->param ?: [] as $couple) {
54
+        array_shift($couple);
55
+        foreach ($couple as $v) {
56
+            $res[] = decompiler_($v, $fmt, $prof);
57
+        }
58
+    }
59
+    $file = is_string($struct->texte) ? $struct->texte :
60
+        decompiler_($struct->texte, $fmt, $prof);
61
+    $f = 'format_inclure_' . $fmt;
62
+
63
+    return $f($file, $res, $prof);
64 64
 }
65 65
 
66 66
 function decompiler_texte($struct, $fmt = '', $prof = 0) {
67
-	$f = 'format_texte_' . $fmt;
67
+    $f = 'format_texte_' . $fmt;
68 68
 
69
-	return strlen((string) $struct->texte) ? $f($struct->texte, $prof) : '';
69
+    return strlen((string) $struct->texte) ? $f($struct->texte, $prof) : '';
70 70
 }
71 71
 
72 72
 function decompiler_polyglotte($struct, $fmt = '', $prof = 0) {
73
-	$f = 'format_polyglotte_' . $fmt;
73
+    $f = 'format_polyglotte_' . $fmt;
74 74
 
75
-	return $f($struct->traductions, $prof);
75
+    return $f($struct->traductions, $prof);
76 76
 }
77 77
 
78 78
 function decompiler_idiome($struct, $fmt = '', $prof = 0) {
79
-	$args = [];
80
-	foreach ($struct->arg as $k => $v) {
81
-		$args[$k] = public_decompiler($v, $fmt, $prof);
82
-	}
79
+    $args = [];
80
+    foreach ($struct->arg as $k => $v) {
81
+        $args[$k] = public_decompiler($v, $fmt, $prof);
82
+    }
83 83
 
84
-	$filtres = decompiler_liste($struct->param, $fmt, $prof);
84
+    $filtres = decompiler_liste($struct->param, $fmt, $prof);
85 85
 
86
-	$f = 'format_idiome_' . $fmt;
86
+    $f = 'format_idiome_' . $fmt;
87 87
 
88
-	return $f($struct->nom_champ, $struct->module, $args, $filtres, $prof);
88
+    return $f($struct->nom_champ, $struct->module, $args, $filtres, $prof);
89 89
 }
90 90
 
91 91
 function decompiler_champ($struct, $fmt = '', $prof = 0) {
92
-	$avant = decompiler_($struct->avant, $fmt, $prof);
93
-	$apres = decompiler_($struct->apres, $fmt, $prof);
94
-	$args = $filtres = '';
95
-	if ($p = $struct->param) {
96
-		if ($p[0][0] === '') {
97
-			$args = decompiler_liste([array_shift($p)], $fmt, $prof);
98
-		}
99
-		$filtres = decompiler_liste($p, $fmt, $prof);
100
-	}
101
-	$f = 'format_champ_' . $fmt;
102
-
103
-	return $f($struct->nom_champ, $struct->nom_boucle, $struct->etoile, $avant, $apres, $args, $filtres, $prof);
92
+    $avant = decompiler_($struct->avant, $fmt, $prof);
93
+    $apres = decompiler_($struct->apres, $fmt, $prof);
94
+    $args = $filtres = '';
95
+    if ($p = $struct->param) {
96
+        if ($p[0][0] === '') {
97
+            $args = decompiler_liste([array_shift($p)], $fmt, $prof);
98
+        }
99
+        $filtres = decompiler_liste($p, $fmt, $prof);
100
+    }
101
+    $f = 'format_champ_' . $fmt;
102
+
103
+    return $f($struct->nom_champ, $struct->nom_boucle, $struct->etoile, $avant, $apres, $args, $filtres, $prof);
104 104
 }
105 105
 
106 106
 function decompiler_liste($sources, $fmt = '', $prof = 0) {
107
-	if (!is_array($sources)) {
108
-		return '';
109
-	}
110
-	$f = 'format_liste_' . $fmt;
111
-	$res = '';
112
-	foreach ($sources as $arg) {
113
-		if (!is_array($arg)) {
114
-			continue; // ne devrait pas arriver.
115
-		} else {
116
-			$r = array_shift($arg);
117
-		}
118
-		$args = [];
119
-		foreach ($arg as $v) {
120
-			// cas des arguments entoures de ' ou "
121
-			if (
122
-				(is_countable($v) ? count($v) : 0) == 1
123
-				&& $v[0]->type == 'texte'
124
-				&& strlen((string) $v[0]->apres) == 1
125
-				&& $v[0]->apres == $v[0]->avant
126
-			) {
127
-				$args[] = $v[0]->avant . $v[0]->texte . $v[0]->apres;
128
-			} else {
129
-				$args[] = decompiler_($v, $fmt, 0 - $prof);
130
-			}
131
-		}
132
-		if ($r !== '' || $args) {
133
-			$res .= $f($r, $args, $prof);
134
-		}
135
-	}
136
-
137
-	return $res;
107
+    if (!is_array($sources)) {
108
+        return '';
109
+    }
110
+    $f = 'format_liste_' . $fmt;
111
+    $res = '';
112
+    foreach ($sources as $arg) {
113
+        if (!is_array($arg)) {
114
+            continue; // ne devrait pas arriver.
115
+        } else {
116
+            $r = array_shift($arg);
117
+        }
118
+        $args = [];
119
+        foreach ($arg as $v) {
120
+            // cas des arguments entoures de ' ou "
121
+            if (
122
+                (is_countable($v) ? count($v) : 0) == 1
123
+                && $v[0]->type == 'texte'
124
+                && strlen((string) $v[0]->apres) == 1
125
+                && $v[0]->apres == $v[0]->avant
126
+            ) {
127
+                $args[] = $v[0]->avant . $v[0]->texte . $v[0]->apres;
128
+            } else {
129
+                $args[] = decompiler_($v, $fmt, 0 - $prof);
130
+            }
131
+        }
132
+        if ($r !== '' || $args) {
133
+            $res .= $f($r, $args, $prof);
134
+        }
135
+    }
136
+
137
+    return $res;
138 138
 }
139 139
 
140 140
 // Decompilation des criteres: on triche et on deroge:
@@ -142,93 +142,93 @@  discard block
 block discarded – undo
142 142
 // - le champ apres signale le critere {"separateur"} ou {'separateur'}
143 143
 // - les champs sont implicitement etendus (crochets implicites mais interdits)
144 144
 function decompiler_criteres($boucle, $fmt = '', $prof = 0) {
145
-	$sources = $boucle->param;
146
-	if (!is_array($sources)) {
147
-		return '';
148
-	}
149
-	$res = '';
150
-	$f = 'format_critere_' . $fmt;
151
-	foreach ($sources as $crit) {
152
-		if (!is_array($crit)) {
153
-			continue;
154
-		} // boucle recursive
155
-		array_shift($crit);
156
-		$args = [];
157
-		foreach ($crit as $i => $v) {
158
-			if (
159
-				(is_countable($v) ? count($v) : 0) == 1
160
-				&& $v[0]->type == 'texte'
161
-				&& $v[0]->apres
162
-			) {
163
-				$args[] = [['texte', ($v[0]->apres . $v[0]->texte . $v[0]->apres)]];
164
-			} else {
165
-				$res2 = [];
166
-				foreach ($v as $k => $p) {
167
-					if (
168
-						isset($p->type)
169
-						&& function_exists($d = 'decompiler_' . $p->type)
170
-					) {
171
-						$r = $d($p, $fmt, (0 - $prof));
172
-						$res2[] = [$p->type, $r];
173
-					} else {
174
-						spip_logger()->info("critere $i / $k mal forme");
175
-					}
176
-				}
177
-				$args[] = $res2;
178
-			}
179
-		}
180
-		$res .= $f($args);
181
-	}
182
-
183
-	return $res;
145
+    $sources = $boucle->param;
146
+    if (!is_array($sources)) {
147
+        return '';
148
+    }
149
+    $res = '';
150
+    $f = 'format_critere_' . $fmt;
151
+    foreach ($sources as $crit) {
152
+        if (!is_array($crit)) {
153
+            continue;
154
+        } // boucle recursive
155
+        array_shift($crit);
156
+        $args = [];
157
+        foreach ($crit as $i => $v) {
158
+            if (
159
+                (is_countable($v) ? count($v) : 0) == 1
160
+                && $v[0]->type == 'texte'
161
+                && $v[0]->apres
162
+            ) {
163
+                $args[] = [['texte', ($v[0]->apres . $v[0]->texte . $v[0]->apres)]];
164
+            } else {
165
+                $res2 = [];
166
+                foreach ($v as $k => $p) {
167
+                    if (
168
+                        isset($p->type)
169
+                        && function_exists($d = 'decompiler_' . $p->type)
170
+                    ) {
171
+                        $r = $d($p, $fmt, (0 - $prof));
172
+                        $res2[] = [$p->type, $r];
173
+                    } else {
174
+                        spip_logger()->info("critere $i / $k mal forme");
175
+                    }
176
+                }
177
+                $args[] = $res2;
178
+            }
179
+        }
180
+        $res .= $f($args);
181
+    }
182
+
183
+    return $res;
184 184
 }
185 185
 
186 186
 
187 187
 function decompiler_($liste, $fmt = '', $prof = 0) {
188
-	if (!is_array($liste)) {
189
-		return '';
190
-	}
191
-	$prof2 = ($prof < 0) ? ($prof - 1) : ($prof + 1);
192
-	$contenu = [];
193
-	foreach ($liste as $k => $p) {
194
-		if (!isset($p->type)) {
195
-			continue;
196
-		} #??????
197
-		$d = 'decompiler_' . $p->type;
198
-		$next = $liste[$k + 1] ?? false;
199
-		// Forcer le champ etendu si son source (pas les reecritures)
200
-		// contenait des args et s'il est suivi d'espaces,
201
-		// le champ simple les eliminant est un bug helas perenne.
202
-
203
-		if (
204
-			$next
205
-			&& $next->type == 'texte'
206
-			&& $p->type == 'champ'
207
-			&& !$p->apres
208
-			&& !$p->avant
209
-			&& $p->fonctions
210
-		) {
211
-			$n = strlen((string) $next->texte) - strlen(ltrim((string) $next->texte));
212
-			if ($n) {
213
-				$champ = new Texte();
214
-				$champ->texte = substr((string) $next->texte, 0, $n);
215
-				$champ->ligne = $p->ligne;
216
-				$p->apres = [$champ];
217
-				$next->texte = substr((string) $next->texte, $n);
218
-			}
219
-		}
220
-		$contenu[] = [$d($p, $fmt, $prof2), $p->type];
221
-	}
222
-	$f = 'format_suite_' . $fmt;
223
-
224
-	return $f($contenu);
188
+    if (!is_array($liste)) {
189
+        return '';
190
+    }
191
+    $prof2 = ($prof < 0) ? ($prof - 1) : ($prof + 1);
192
+    $contenu = [];
193
+    foreach ($liste as $k => $p) {
194
+        if (!isset($p->type)) {
195
+            continue;
196
+        } #??????
197
+        $d = 'decompiler_' . $p->type;
198
+        $next = $liste[$k + 1] ?? false;
199
+        // Forcer le champ etendu si son source (pas les reecritures)
200
+        // contenait des args et s'il est suivi d'espaces,
201
+        // le champ simple les eliminant est un bug helas perenne.
202
+
203
+        if (
204
+            $next
205
+            && $next->type == 'texte'
206
+            && $p->type == 'champ'
207
+            && !$p->apres
208
+            && !$p->avant
209
+            && $p->fonctions
210
+        ) {
211
+            $n = strlen((string) $next->texte) - strlen(ltrim((string) $next->texte));
212
+            if ($n) {
213
+                $champ = new Texte();
214
+                $champ->texte = substr((string) $next->texte, 0, $n);
215
+                $champ->ligne = $p->ligne;
216
+                $p->apres = [$champ];
217
+                $next->texte = substr((string) $next->texte, $n);
218
+            }
219
+        }
220
+        $contenu[] = [$d($p, $fmt, $prof2), $p->type];
221
+    }
222
+    $f = 'format_suite_' . $fmt;
223
+
224
+    return $f($contenu);
225 225
 }
226 226
 
227 227
 function public_decompiler($liste, $fmt = '', $prof = 0, $quoi = '') {
228
-	if (!include_spip('public/format_' . $fmt)) {
229
-		return "'$fmt'?";
230
-	}
231
-	$f = 'decompiler_' . $quoi;
228
+    if (!include_spip('public/format_' . $fmt)) {
229
+        return "'$fmt'?";
230
+    }
231
+    $f = 'decompiler_' . $quoi;
232 232
 
233
-	return $f($liste, $fmt, $prof);
233
+    return $f($liste, $fmt, $prof);
234 234
 }
Please login to merge, or discard this patch.
ecrire/public/parametrer.php 2 patches
Indentation   +247 added lines, -247 removed lines patch added patch discarded remove patch
@@ -10,7 +10,7 @@  discard block
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 include_fichiers_fonctions();
@@ -29,178 +29,178 @@  discard block
 block discarded – undo
29 29
 # En cas d'erreur process_ins est absent et texte est un tableau de 2 chaines
30 30
 
31 31
 function public_parametrer_dist($fond, $contexte = '', $cache = '', string $connect = '') {
32
-	static $composer, $styliser, $notes = null;
33
-	$courant = null;
34
-	$page = tester_redirection($fond, $contexte, $connect);
35
-	if ($page) {
36
-		return $page;
37
-	}
38
-
39
-	if (isset($contexte['lang'])) {
40
-		$lang = $contexte['lang'];
41
-	} elseif (!isset($lang)) {
42
-		$lang = $GLOBALS['meta']['langue_site'];
43
-	}
44
-
45
-	$select = ((!isset($GLOBALS['forcer_lang']) || !$GLOBALS['forcer_lang']) && $lang != $GLOBALS['spip_lang']);
46
-	if ($select) {
47
-		$select = lang_select($lang);
48
-	}
49
-
50
-	$debug = (defined('_VAR_MODE') && _VAR_MODE == 'debug');
51
-
52
-	if (!$styliser) {
53
-		$styliser = charger_fonction('styliser', 'public');
54
-	}
55
-	[$skel, $mime_type, $gram, $sourcefile] =
56
-		$styliser($fond, $contexte, $GLOBALS['spip_lang'], $connect);
57
-
58
-	if ($skel) {
59
-		// sauver le nom de l'eventuel squelette en cours d'execution
60
-		// (recursion possible a cause des modeles)
61
-		if ($debug) {
62
-			$courant = $GLOBALS['debug_objets']['courant'] ?? null;
63
-			$GLOBALS['debug_objets']['contexte'][$sourcefile] = $contexte;
64
-		}
65
-
66
-		// charger le squelette en specifiant les langages cibles et source
67
-		// au cas il faudrait le compiler (source posterieure au resultat)
68
-
69
-		if (!$composer) {
70
-			$composer = charger_fonction('composer', 'public');
71
-		}
72
-		$fonc = $composer($skel, $mime_type, $gram, $sourcefile, $connect);
73
-	} else {
74
-		$fonc = '';
75
-	}
76
-
77
-	if (!$fonc) { // squelette inconnu (==='') ou faux (===false)
78
-		$page = $fonc;
79
-	} else {
80
-		// Preparer l'appel de la fonction principale du squelette
81
-
82
-		spip_timer($a = 'calcul page ' . random_int(0, 1000));
83
-
84
-		// On cree un marqueur de notes unique lie a cette composition
85
-		// et on enregistre l'etat courant des globales de notes...
86
-		if (is_null($notes)) {
87
-			$notes = charger_fonction('notes', 'inc', true);
88
-		}
89
-		if ($notes) {
90
-			$notes('', 'empiler');
91
-		}
92
-
93
-		// Rajouter d'office ces deux parametres
94
-		// (mais vaudrait mieux que le compilateur sache le simuler
95
-		// car ca interdit l'usage de criteres conditionnels dessus).
96
-		if (!isset($contexte['date'])) {
97
-			$contexte['date'] = date('Y-m-d H:i:s');
98
-			$contexte['date_default'] = true;
99
-		} else {
100
-			$contexte['date'] = normaliser_date($contexte['date'], true);
101
-		}
102
-
103
-		if (!isset($contexte['date_redac'])) {
104
-			$contexte['date_redac'] = date('Y-m-d H:i:s');
105
-			$contexte['date_redac_default'] = true;
106
-		} else {
107
-			$contexte['date_redac'] = normaliser_date($contexte['date_redac'], true);
108
-		}
109
-
110
-		// Passer le nom du cache pour produire sa destruction automatique
111
-		try {
112
-			$page = $fonc(['cache' => $cache], [$contexte]);
113
-		} catch (Throwable $e) {
114
-			$msg = _T('zbug_erreur_execution_page') . " $sourcefile";
115
-			$full_msg = $msg . ' | File ' . $e->getFile() . ' Line ' . $e->getLine() . ' : ' . $e->getMessage();
116
-			$full_msg = str_replace(_ROOT_RACINE, '[…]/', $full_msg);
117
-			$corps = "<pre>$msg</pre>";
118
-			$page = analyse_resultat_skel($fond, ['cache' => $cache], $corps, $sourcefile);
119
-			erreur_squelette($full_msg);
120
-			unset($msg, $full_msg, $corps);
121
-		}
122
-
123
-		// Restituer les globales de notes telles qu'elles etaient avant l'appel
124
-		// Si l'inclus n'a pas affiche ses notes, tant pis (elles *doivent*
125
-		// etre dans son resultat, autrement elles ne seraient pas prises en
126
-		// compte a chaque calcul d'un texte contenant un modele, mais seulement
127
-		// quand le modele serait calcule, et on aurait des resultats incoherents)
128
-		if ($notes) {
129
-			$notes('', 'depiler');
130
-		}
131
-
132
-		// reinjecter en dynamique la pile des notes
133
-		// si il y a des inclure dynamiques
134
-		// si la pile n'est pas vide
135
-		// la generalisation de cette injection permettrait de corriger le point juste au dessus
136
-		// en faisant remonter les notes a l'incluant (A tester et valider avant application)
137
-		if ($notes) {
138
-			$page['notes'] = $notes('', 'sauver_etat');
139
-		}
140
-
141
-		// spip_log: un joli contexte
142
-		$infos = presenter_contexte(array_filter($contexte));
143
-
144
-		$profile = spip_timer($a);
145
-		spip_logger()->info("calcul ($profile) [$skel] $infos"
146
-			. ' (' . strlen((string) $page['texte']) . ' octets)');
147
-
148
-		if (defined('_CALCUL_PROFILER') && (int) $profile > _CALCUL_PROFILER) {
149
-			spip_logger('profiler')->notice("calcul ($profile) [$skel] $infos"
150
-				. ' (' . strlen((string) $page['texte']) . ' octets) | ' . $_SERVER['REQUEST_URI']);
151
-		}
152
-
153
-		if ($debug) {
154
-			// si c'est ce que demande le debusqueur, lui passer la main
155
-			$t = strlen((string) $page['texte']) ? $page['texte'] : ' ';
156
-			$GLOBALS['debug_objets']['resultat'][$fonc . 'tout'] = $t;
157
-			$GLOBALS['debug_objets']['courant'] = $courant;
158
-			$GLOBALS['debug_objets']['profile'][$sourcefile] = $profile;
159
-			if (
160
-				$GLOBALS['debug_objets']['sourcefile']
161
-				&& _request('var_mode_objet') == $fonc
162
-				&& _request('var_mode_affiche') == 'resultat'
163
-			) {
164
-				erreur_squelette();
165
-			}
166
-		}
167
-		// Si #CACHE{} n'etait pas la, le mettre a $delais
168
-		if (!isset($page['entetes']['X-Spip-Cache'])) {
169
-			// Dans l'espace prive ou dans un modeles/ on pose un cache 0 par defaut
170
-			// si aucun #CACHE{} spécifié
171
-			// le contexte implicite qui conditionne le cache assure qu'on retombe pas sur le meme
172
-			// entre public et prive
173
-			if (test_espace_prive() || str_starts_with((string) $fond, 'modeles/')) {
174
-				$page['entetes']['X-Spip-Cache'] = 0;
175
-			} else {
176
-				$page['entetes']['X-Spip-Cache'] = $GLOBALS['delais'] ?? 36000;
177
-			}
178
-		}
179
-
180
-		$page['contexte'] = $contexte;
181
-
182
-		// faire remonter le fichier source
183
-		static $js_inclus = false;
184
-		if (defined('_VAR_INCLURE') && _VAR_INCLURE) {
185
-			$page['sourcefile'] = $sourcefile;
186
-			$page['texte'] =
187
-				"<div class='inclure_blocs'><h6>" . $page['sourcefile'] . '</h6>' . $page['texte'] . '</div>'
188
-				. ($js_inclus ? '' : "<script type='text/javascript'>jQuery(function(){jQuery('.inclure_blocs > h6:first-child').hover(function(){jQuery(this).parent().addClass('hover')},function(){jQuery(this).parent().removeClass('hover')})});</script>");
189
-			$js_inclus = true;
190
-		}
191
-
192
-		// Si un modele contenait #SESSION, on note l'info dans $page
193
-		if (isset($GLOBALS['cache_utilise_session'])) {
194
-			$page['invalideurs']['session'] = $GLOBALS['cache_utilise_session'];
195
-			unset($GLOBALS['cache_utilise_session']);
196
-		}
197
-	}
198
-
199
-	if ($select) {
200
-		lang_select();
201
-	}
202
-
203
-	return $page;
32
+    static $composer, $styliser, $notes = null;
33
+    $courant = null;
34
+    $page = tester_redirection($fond, $contexte, $connect);
35
+    if ($page) {
36
+        return $page;
37
+    }
38
+
39
+    if (isset($contexte['lang'])) {
40
+        $lang = $contexte['lang'];
41
+    } elseif (!isset($lang)) {
42
+        $lang = $GLOBALS['meta']['langue_site'];
43
+    }
44
+
45
+    $select = ((!isset($GLOBALS['forcer_lang']) || !$GLOBALS['forcer_lang']) && $lang != $GLOBALS['spip_lang']);
46
+    if ($select) {
47
+        $select = lang_select($lang);
48
+    }
49
+
50
+    $debug = (defined('_VAR_MODE') && _VAR_MODE == 'debug');
51
+
52
+    if (!$styliser) {
53
+        $styliser = charger_fonction('styliser', 'public');
54
+    }
55
+    [$skel, $mime_type, $gram, $sourcefile] =
56
+        $styliser($fond, $contexte, $GLOBALS['spip_lang'], $connect);
57
+
58
+    if ($skel) {
59
+        // sauver le nom de l'eventuel squelette en cours d'execution
60
+        // (recursion possible a cause des modeles)
61
+        if ($debug) {
62
+            $courant = $GLOBALS['debug_objets']['courant'] ?? null;
63
+            $GLOBALS['debug_objets']['contexte'][$sourcefile] = $contexte;
64
+        }
65
+
66
+        // charger le squelette en specifiant les langages cibles et source
67
+        // au cas il faudrait le compiler (source posterieure au resultat)
68
+
69
+        if (!$composer) {
70
+            $composer = charger_fonction('composer', 'public');
71
+        }
72
+        $fonc = $composer($skel, $mime_type, $gram, $sourcefile, $connect);
73
+    } else {
74
+        $fonc = '';
75
+    }
76
+
77
+    if (!$fonc) { // squelette inconnu (==='') ou faux (===false)
78
+        $page = $fonc;
79
+    } else {
80
+        // Preparer l'appel de la fonction principale du squelette
81
+
82
+        spip_timer($a = 'calcul page ' . random_int(0, 1000));
83
+
84
+        // On cree un marqueur de notes unique lie a cette composition
85
+        // et on enregistre l'etat courant des globales de notes...
86
+        if (is_null($notes)) {
87
+            $notes = charger_fonction('notes', 'inc', true);
88
+        }
89
+        if ($notes) {
90
+            $notes('', 'empiler');
91
+        }
92
+
93
+        // Rajouter d'office ces deux parametres
94
+        // (mais vaudrait mieux que le compilateur sache le simuler
95
+        // car ca interdit l'usage de criteres conditionnels dessus).
96
+        if (!isset($contexte['date'])) {
97
+            $contexte['date'] = date('Y-m-d H:i:s');
98
+            $contexte['date_default'] = true;
99
+        } else {
100
+            $contexte['date'] = normaliser_date($contexte['date'], true);
101
+        }
102
+
103
+        if (!isset($contexte['date_redac'])) {
104
+            $contexte['date_redac'] = date('Y-m-d H:i:s');
105
+            $contexte['date_redac_default'] = true;
106
+        } else {
107
+            $contexte['date_redac'] = normaliser_date($contexte['date_redac'], true);
108
+        }
109
+
110
+        // Passer le nom du cache pour produire sa destruction automatique
111
+        try {
112
+            $page = $fonc(['cache' => $cache], [$contexte]);
113
+        } catch (Throwable $e) {
114
+            $msg = _T('zbug_erreur_execution_page') . " $sourcefile";
115
+            $full_msg = $msg . ' | File ' . $e->getFile() . ' Line ' . $e->getLine() . ' : ' . $e->getMessage();
116
+            $full_msg = str_replace(_ROOT_RACINE, '[…]/', $full_msg);
117
+            $corps = "<pre>$msg</pre>";
118
+            $page = analyse_resultat_skel($fond, ['cache' => $cache], $corps, $sourcefile);
119
+            erreur_squelette($full_msg);
120
+            unset($msg, $full_msg, $corps);
121
+        }
122
+
123
+        // Restituer les globales de notes telles qu'elles etaient avant l'appel
124
+        // Si l'inclus n'a pas affiche ses notes, tant pis (elles *doivent*
125
+        // etre dans son resultat, autrement elles ne seraient pas prises en
126
+        // compte a chaque calcul d'un texte contenant un modele, mais seulement
127
+        // quand le modele serait calcule, et on aurait des resultats incoherents)
128
+        if ($notes) {
129
+            $notes('', 'depiler');
130
+        }
131
+
132
+        // reinjecter en dynamique la pile des notes
133
+        // si il y a des inclure dynamiques
134
+        // si la pile n'est pas vide
135
+        // la generalisation de cette injection permettrait de corriger le point juste au dessus
136
+        // en faisant remonter les notes a l'incluant (A tester et valider avant application)
137
+        if ($notes) {
138
+            $page['notes'] = $notes('', 'sauver_etat');
139
+        }
140
+
141
+        // spip_log: un joli contexte
142
+        $infos = presenter_contexte(array_filter($contexte));
143
+
144
+        $profile = spip_timer($a);
145
+        spip_logger()->info("calcul ($profile) [$skel] $infos"
146
+            . ' (' . strlen((string) $page['texte']) . ' octets)');
147
+
148
+        if (defined('_CALCUL_PROFILER') && (int) $profile > _CALCUL_PROFILER) {
149
+            spip_logger('profiler')->notice("calcul ($profile) [$skel] $infos"
150
+                . ' (' . strlen((string) $page['texte']) . ' octets) | ' . $_SERVER['REQUEST_URI']);
151
+        }
152
+
153
+        if ($debug) {
154
+            // si c'est ce que demande le debusqueur, lui passer la main
155
+            $t = strlen((string) $page['texte']) ? $page['texte'] : ' ';
156
+            $GLOBALS['debug_objets']['resultat'][$fonc . 'tout'] = $t;
157
+            $GLOBALS['debug_objets']['courant'] = $courant;
158
+            $GLOBALS['debug_objets']['profile'][$sourcefile] = $profile;
159
+            if (
160
+                $GLOBALS['debug_objets']['sourcefile']
161
+                && _request('var_mode_objet') == $fonc
162
+                && _request('var_mode_affiche') == 'resultat'
163
+            ) {
164
+                erreur_squelette();
165
+            }
166
+        }
167
+        // Si #CACHE{} n'etait pas la, le mettre a $delais
168
+        if (!isset($page['entetes']['X-Spip-Cache'])) {
169
+            // Dans l'espace prive ou dans un modeles/ on pose un cache 0 par defaut
170
+            // si aucun #CACHE{} spécifié
171
+            // le contexte implicite qui conditionne le cache assure qu'on retombe pas sur le meme
172
+            // entre public et prive
173
+            if (test_espace_prive() || str_starts_with((string) $fond, 'modeles/')) {
174
+                $page['entetes']['X-Spip-Cache'] = 0;
175
+            } else {
176
+                $page['entetes']['X-Spip-Cache'] = $GLOBALS['delais'] ?? 36000;
177
+            }
178
+        }
179
+
180
+        $page['contexte'] = $contexte;
181
+
182
+        // faire remonter le fichier source
183
+        static $js_inclus = false;
184
+        if (defined('_VAR_INCLURE') && _VAR_INCLURE) {
185
+            $page['sourcefile'] = $sourcefile;
186
+            $page['texte'] =
187
+                "<div class='inclure_blocs'><h6>" . $page['sourcefile'] . '</h6>' . $page['texte'] . '</div>'
188
+                . ($js_inclus ? '' : "<script type='text/javascript'>jQuery(function(){jQuery('.inclure_blocs > h6:first-child').hover(function(){jQuery(this).parent().addClass('hover')},function(){jQuery(this).parent().removeClass('hover')})});</script>");
189
+            $js_inclus = true;
190
+        }
191
+
192
+        // Si un modele contenait #SESSION, on note l'info dans $page
193
+        if (isset($GLOBALS['cache_utilise_session'])) {
194
+            $page['invalideurs']['session'] = $GLOBALS['cache_utilise_session'];
195
+            unset($GLOBALS['cache_utilise_session']);
196
+        }
197
+    }
198
+
199
+    if ($select) {
200
+        lang_select();
201
+    }
202
+
203
+    return $page;
204 204
 }
205 205
 
206 206
 /**
@@ -209,37 +209,37 @@  discard block
 block discarded – undo
209 209
  * @return string
210 210
 */
211 211
 function presenter_contexte($contexte, $profondeur_max = 1, $max_lines = 0) {
212
-	$infos = [];
213
-	$line = 0;
214
-	foreach ($contexte as $var => $val) {
215
-		$line++;
216
-		if ($max_lines && $max_lines < $line) {
217
-			$infos[] = '…';
218
-			break;
219
-		}
220
-		if ($val === null) {
221
-			$val = '';
222
-		} elseif (is_array($val)) {
223
-			if ($profondeur_max > 0) {
224
-				$val = 'array:' . count($val) . '(' . presenter_contexte($val, $profondeur_max - 1, 3) . ')';
225
-			} else {
226
-				$val = 'array:' . count($val);
227
-			}
228
-		} elseif (is_object($val)) {
229
-			$val = $val::class;
230
-		} elseif (strlen("$val") > 30) {
231
-			$val = substr("$val", 0, 29) . '…';
232
-			if (strstr($val, ' ')) {
233
-				$val = "'$val'";
234
-			}
235
-		} elseif (strstr((string) $val, ' ')) {
236
-			$val = "'$val'";
237
-		} elseif (!strlen((string) $val)) {
238
-			$val = "''";
239
-		}
240
-		$infos[] = $var . '=' . $val;
241
-	}
242
-	return implode(', ', $infos);
212
+    $infos = [];
213
+    $line = 0;
214
+    foreach ($contexte as $var => $val) {
215
+        $line++;
216
+        if ($max_lines && $max_lines < $line) {
217
+            $infos[] = '…';
218
+            break;
219
+        }
220
+        if ($val === null) {
221
+            $val = '';
222
+        } elseif (is_array($val)) {
223
+            if ($profondeur_max > 0) {
224
+                $val = 'array:' . count($val) . '(' . presenter_contexte($val, $profondeur_max - 1, 3) . ')';
225
+            } else {
226
+                $val = 'array:' . count($val);
227
+            }
228
+        } elseif (is_object($val)) {
229
+            $val = $val::class;
230
+        } elseif (strlen("$val") > 30) {
231
+            $val = substr("$val", 0, 29) . '…';
232
+            if (strstr($val, ' ')) {
233
+                $val = "'$val'";
234
+            }
235
+        } elseif (strstr((string) $val, ' ')) {
236
+            $val = "'$val'";
237
+        } elseif (!strlen((string) $val)) {
238
+            $val = "''";
239
+        }
240
+        $infos[] = $var . '=' . $val;
241
+    }
242
+    return implode(', ', $infos);
243 243
 }
244 244
 
245 245
 
@@ -256,11 +256,11 @@  discard block
 block discarded – undo
256 256
  * @return array|bool
257 257
  */
258 258
 function tester_redirection($fond, $contexte, $connect) {
259
-	static $tester_redirection = null;
260
-	if (is_null($tester_redirection)) {
261
-		$tester_redirection = charger_fonction('tester_redirection', 'public');
262
-	}
263
-	return $tester_redirection($fond, $contexte, $connect);
259
+    static $tester_redirection = null;
260
+    if (is_null($tester_redirection)) {
261
+        $tester_redirection = charger_fonction('tester_redirection', 'public');
262
+    }
263
+    return $tester_redirection($fond, $contexte, $connect);
264 264
 }
265 265
 
266 266
 
@@ -276,42 +276,42 @@  discard block
 block discarded – undo
276 276
  * @return array|bool
277 277
  */
278 278
 function public_tester_redirection_dist($fond, $contexte, $connect) {
279
-	if (
280
-		$fond == 'article'
281
-		&& !empty($contexte['id_article'])
282
-		&& ($id_article = (int) $contexte['id_article'])
283
-	) {
284
-		include_spip('public/quete'); // pour quete_virtuel et ses dependances
285
-		$m = quete_virtuel($id_article, $connect) ?? '';
286
-		if (strlen($m)) {
287
-			include_spip('inc/texte');
288
-			// les navigateurs pataugent si l'URL est vide
289
-			if ($url = virtuel_redirige($m, true)) {
290
-				// passer en url absolue car cette redirection pourra
291
-				// etre utilisee dans un contexte d'url qui change
292
-				// y compris url arbo
293
-				$status = 302;
294
-				if (defined('_STATUS_REDIRECTION_VIRTUEL')) {
295
-					$status = _STATUS_REDIRECTION_VIRTUEL;
296
-				}
297
-				if (!preg_match(',^\w+:,', (string) $url)) {
298
-					include_spip('inc/filtres_mini');
299
-					$url = url_absolue($url);
300
-				}
301
-				$url = str_replace('&amp;', '&', (string) $url);
302
-
303
-				return [
304
-					'texte' => '<'
305
-						. "?php include_spip('inc/headers');redirige_par_entete('"
306
-						. texte_script($url)
307
-						. "','',$status);"
308
-						. '?' . '>',
309
-					'process_ins' => 'php',
310
-					'status' => $status
311
-				];
312
-			}
313
-		}
314
-	}
315
-
316
-	return false;
279
+    if (
280
+        $fond == 'article'
281
+        && !empty($contexte['id_article'])
282
+        && ($id_article = (int) $contexte['id_article'])
283
+    ) {
284
+        include_spip('public/quete'); // pour quete_virtuel et ses dependances
285
+        $m = quete_virtuel($id_article, $connect) ?? '';
286
+        if (strlen($m)) {
287
+            include_spip('inc/texte');
288
+            // les navigateurs pataugent si l'URL est vide
289
+            if ($url = virtuel_redirige($m, true)) {
290
+                // passer en url absolue car cette redirection pourra
291
+                // etre utilisee dans un contexte d'url qui change
292
+                // y compris url arbo
293
+                $status = 302;
294
+                if (defined('_STATUS_REDIRECTION_VIRTUEL')) {
295
+                    $status = _STATUS_REDIRECTION_VIRTUEL;
296
+                }
297
+                if (!preg_match(',^\w+:,', (string) $url)) {
298
+                    include_spip('inc/filtres_mini');
299
+                    $url = url_absolue($url);
300
+                }
301
+                $url = str_replace('&amp;', '&', (string) $url);
302
+
303
+                return [
304
+                    'texte' => '<'
305
+                        . "?php include_spip('inc/headers');redirige_par_entete('"
306
+                        . texte_script($url)
307
+                        . "','',$status);"
308
+                        . '?' . '>',
309
+                    'process_ins' => 'php',
310
+                    'status' => $status
311
+                ];
312
+            }
313
+        }
314
+    }
315
+
316
+    return false;
317 317
 }
Please login to merge, or discard this patch.
Spacing   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -79,7 +79,7 @@  discard block
 block discarded – undo
79 79
 	} else {
80 80
 		// Preparer l'appel de la fonction principale du squelette
81 81
 
82
-		spip_timer($a = 'calcul page ' . random_int(0, 1000));
82
+		spip_timer($a = 'calcul page '.random_int(0, 1000));
83 83
 
84 84
 		// On cree un marqueur de notes unique lie a cette composition
85 85
 		// et on enregistre l'etat courant des globales de notes...
@@ -111,8 +111,8 @@  discard block
 block discarded – undo
111 111
 		try {
112 112
 			$page = $fonc(['cache' => $cache], [$contexte]);
113 113
 		} catch (Throwable $e) {
114
-			$msg = _T('zbug_erreur_execution_page') . " $sourcefile";
115
-			$full_msg = $msg . ' | File ' . $e->getFile() . ' Line ' . $e->getLine() . ' : ' . $e->getMessage();
114
+			$msg = _T('zbug_erreur_execution_page')." $sourcefile";
115
+			$full_msg = $msg.' | File '.$e->getFile().' Line '.$e->getLine().' : '.$e->getMessage();
116 116
 			$full_msg = str_replace(_ROOT_RACINE, '[…]/', $full_msg);
117 117
 			$corps = "<pre>$msg</pre>";
118 118
 			$page = analyse_resultat_skel($fond, ['cache' => $cache], $corps, $sourcefile);
@@ -143,17 +143,17 @@  discard block
 block discarded – undo
143 143
 
144 144
 		$profile = spip_timer($a);
145 145
 		spip_logger()->info("calcul ($profile) [$skel] $infos"
146
-			. ' (' . strlen((string) $page['texte']) . ' octets)');
146
+			. ' ('.strlen((string) $page['texte']).' octets)');
147 147
 
148 148
 		if (defined('_CALCUL_PROFILER') && (int) $profile > _CALCUL_PROFILER) {
149 149
 			spip_logger('profiler')->notice("calcul ($profile) [$skel] $infos"
150
-				. ' (' . strlen((string) $page['texte']) . ' octets) | ' . $_SERVER['REQUEST_URI']);
150
+				. ' ('.strlen((string) $page['texte']).' octets) | '.$_SERVER['REQUEST_URI']);
151 151
 		}
152 152
 
153 153
 		if ($debug) {
154 154
 			// si c'est ce que demande le debusqueur, lui passer la main
155 155
 			$t = strlen((string) $page['texte']) ? $page['texte'] : ' ';
156
-			$GLOBALS['debug_objets']['resultat'][$fonc . 'tout'] = $t;
156
+			$GLOBALS['debug_objets']['resultat'][$fonc.'tout'] = $t;
157 157
 			$GLOBALS['debug_objets']['courant'] = $courant;
158 158
 			$GLOBALS['debug_objets']['profile'][$sourcefile] = $profile;
159 159
 			if (
@@ -184,7 +184,7 @@  discard block
 block discarded – undo
184 184
 		if (defined('_VAR_INCLURE') && _VAR_INCLURE) {
185 185
 			$page['sourcefile'] = $sourcefile;
186 186
 			$page['texte'] =
187
-				"<div class='inclure_blocs'><h6>" . $page['sourcefile'] . '</h6>' . $page['texte'] . '</div>'
187
+				"<div class='inclure_blocs'><h6>".$page['sourcefile'].'</h6>'.$page['texte'].'</div>'
188 188
 				. ($js_inclus ? '' : "<script type='text/javascript'>jQuery(function(){jQuery('.inclure_blocs > h6:first-child').hover(function(){jQuery(this).parent().addClass('hover')},function(){jQuery(this).parent().removeClass('hover')})});</script>");
189 189
 			$js_inclus = true;
190 190
 		}
@@ -221,14 +221,14 @@  discard block
 block discarded – undo
221 221
 			$val = '';
222 222
 		} elseif (is_array($val)) {
223 223
 			if ($profondeur_max > 0) {
224
-				$val = 'array:' . count($val) . '(' . presenter_contexte($val, $profondeur_max - 1, 3) . ')';
224
+				$val = 'array:'.count($val).'('.presenter_contexte($val, $profondeur_max - 1, 3).')';
225 225
 			} else {
226
-				$val = 'array:' . count($val);
226
+				$val = 'array:'.count($val);
227 227
 			}
228 228
 		} elseif (is_object($val)) {
229 229
 			$val = $val::class;
230 230
 		} elseif (strlen("$val") > 30) {
231
-			$val = substr("$val", 0, 29) . '…';
231
+			$val = substr("$val", 0, 29).'…';
232 232
 			if (strstr($val, ' ')) {
233 233
 				$val = "'$val'";
234 234
 			}
@@ -237,7 +237,7 @@  discard block
 block discarded – undo
237 237
 		} elseif (!strlen((string) $val)) {
238 238
 			$val = "''";
239 239
 		}
240
-		$infos[] = $var . '=' . $val;
240
+		$infos[] = $var.'='.$val;
241 241
 	}
242 242
 	return implode(', ', $infos);
243 243
 }
@@ -305,7 +305,7 @@  discard block
 block discarded – undo
305 305
 						. "?php include_spip('inc/headers');redirige_par_entete('"
306 306
 						. texte_script($url)
307 307
 						. "','',$status);"
308
-						. '?' . '>',
308
+						. '?'.'>',
309 309
 					'process_ins' => 'php',
310 310
 					'status' => $status
311 311
 				];
Please login to merge, or discard this patch.
ecrire/public/references.php 2 patches
Indentation   +532 added lines, -532 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  * @package SPIP\Core\Compilateur\References
19 19
  **/
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 /**
@@ -43,14 +43,14 @@  discard block
 block discarded – undo
43 43
  *     - '' si une référence explicite incorrecte est envoyée
44 44
  */
45 45
 function index_boucle($p) {
46
-	if (strlen($p->nom_boucle)) {
47
-		// retourne l’index explicite demandé s’il existe
48
-		if (!empty($p->boucles[$p->nom_boucle])) {
49
-			return $p->nom_boucle;
50
-		}
51
-		return '';
52
-	}
53
-	return $p->id_boucle;
46
+    if (strlen($p->nom_boucle)) {
47
+        // retourne l’index explicite demandé s’il existe
48
+        if (!empty($p->boucles[$p->nom_boucle])) {
49
+            return $p->nom_boucle;
50
+        }
51
+        return '';
52
+    }
53
+    return $p->id_boucle;
54 54
 }
55 55
 
56 56
 
@@ -73,17 +73,17 @@  discard block
 block discarded – undo
73 73
  *     - '' si une référence explicite incorrecte est envoyée
74 74
  */
75 75
 function index_boucle_mere($p) {
76
-	if (strlen($p->nom_boucle)) {
77
-		// retourne l’index explicite demandé s’il existe
78
-		if (!empty($p->boucles[$p->nom_boucle])) {
79
-			return $p->nom_boucle;
80
-		}
81
-		return '';
82
-	}
83
-	if (!empty($p->descr['id_mere'])) {
84
-		return $p->descr['id_mere'];
85
-	}
86
-	return '';
76
+    if (strlen($p->nom_boucle)) {
77
+        // retourne l’index explicite demandé s’il existe
78
+        if (!empty($p->boucles[$p->nom_boucle])) {
79
+            return $p->nom_boucle;
80
+        }
81
+        return '';
82
+    }
83
+    if (!empty($p->descr['id_mere'])) {
84
+        return $p->descr['id_mere'];
85
+    }
86
+    return '';
87 87
 }
88 88
 
89 89
 /**
@@ -117,74 +117,74 @@  discard block
 block discarded – undo
117 117
  *     Code PHP pour obtenir le champ SQL
118 118
  */
119 119
 function index_pile(
120
-	$idb,
121
-	$nom_champ,
122
-	&$boucles,
123
-	$explicite = '',
124
-	$defaut = null,
125
-	$remonte_pile = true,
126
-	$select = true
120
+    $idb,
121
+    $nom_champ,
122
+    &$boucles,
123
+    $explicite = '',
124
+    $defaut = null,
125
+    $remonte_pile = true,
126
+    $select = true
127 127
 ) {
128
-	if (!is_string($defaut)) {
129
-		$defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)';
130
-	}
131
-
132
-	$idb_origine = $idb;
133
-	$nom_champ_origine = $nom_champ;
134
-
135
-	$i = 0;
136
-	if (strlen($explicite)) {
137
-		// Recherche d'un champ dans un etage superieur
138
-		while (($idb !== $explicite) && ($idb !== '')) {
139
-			#	spip_logger()->info("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'");
140
-			$i++;
141
-			$idb = $boucles[$idb]->id_parent;
142
-		}
143
-	}
144
-
145
-	#	spip_logger()->info("Cherche: $nom_champ a partir de '$idb'");
146
-	$nom_champ = strtolower($nom_champ);
147
-	$conditionnel = [];
148
-	// attention: entre la boucle nommee 0, "" et le tableau vide,
149
-	// il y a incoherences qu'il vaut mieux eviter
150
-	while (isset($boucles[$idb])) {
151
-		$joker = true;
152
-		// modifie $joker si tous les champs sont autorisés.
153
-		// $t = le select pour le champ, si on l'a trouvé (ou si joker)
154
-		// $c = le nom du champ demandé
155
-		[$t, $c] = index_tables_en_pile($idb, $nom_champ, $boucles, $joker);
156
-		if ($t) {
157
-			if ($select && !in_array($t, $boucles[$idb]->select)) {
158
-				$boucles[$idb]->select[] = $t;
159
-			}
160
-			// renseigner la boucle source de ce champ pour les traitements
161
-			$boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb;
162
-			$champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']';
163
-			if (!$joker) {
164
-				return index_compose($conditionnel, $champ);
165
-			}
166
-
167
-			// tant que l'on trouve des tables avec joker, on continue
168
-			// avec la boucle parente et on conditionne à l'exécution
169
-			// la présence du champ. Si le champ existe à l'exécution
170
-			// dans une boucle, il est pris, sinon on le cherche dans le parent...
171
-			$conditionnel[] = "isset($champ)?$champ";
172
-		}
173
-
174
-		if ($remonte_pile) {
175
-			#	spip_logger()->info("On remonte vers $i");
176
-			// Sinon on remonte d'un cran
177
-			$idb = $boucles[$idb]->id_parent;
178
-			$i++;
179
-		} else {
180
-			$idb = null;
181
-		}
182
-	}
183
-
184
-	#	spip_logger()->info("Pas vu $nom_champ");
185
-	// esperons qu'il y sera
186
-	// ou qu'on a fourni une valeur par "defaut" plus pertinent
187
-	return index_compose($conditionnel, $defaut);
128
+    if (!is_string($defaut)) {
129
+        $defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)';
130
+    }
131
+
132
+    $idb_origine = $idb;
133
+    $nom_champ_origine = $nom_champ;
134
+
135
+    $i = 0;
136
+    if (strlen($explicite)) {
137
+        // Recherche d'un champ dans un etage superieur
138
+        while (($idb !== $explicite) && ($idb !== '')) {
139
+            #	spip_logger()->info("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'");
140
+            $i++;
141
+            $idb = $boucles[$idb]->id_parent;
142
+        }
143
+    }
144
+
145
+    #	spip_logger()->info("Cherche: $nom_champ a partir de '$idb'");
146
+    $nom_champ = strtolower($nom_champ);
147
+    $conditionnel = [];
148
+    // attention: entre la boucle nommee 0, "" et le tableau vide,
149
+    // il y a incoherences qu'il vaut mieux eviter
150
+    while (isset($boucles[$idb])) {
151
+        $joker = true;
152
+        // modifie $joker si tous les champs sont autorisés.
153
+        // $t = le select pour le champ, si on l'a trouvé (ou si joker)
154
+        // $c = le nom du champ demandé
155
+        [$t, $c] = index_tables_en_pile($idb, $nom_champ, $boucles, $joker);
156
+        if ($t) {
157
+            if ($select && !in_array($t, $boucles[$idb]->select)) {
158
+                $boucles[$idb]->select[] = $t;
159
+            }
160
+            // renseigner la boucle source de ce champ pour les traitements
161
+            $boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb;
162
+            $champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']';
163
+            if (!$joker) {
164
+                return index_compose($conditionnel, $champ);
165
+            }
166
+
167
+            // tant que l'on trouve des tables avec joker, on continue
168
+            // avec la boucle parente et on conditionne à l'exécution
169
+            // la présence du champ. Si le champ existe à l'exécution
170
+            // dans une boucle, il est pris, sinon on le cherche dans le parent...
171
+            $conditionnel[] = "isset($champ)?$champ";
172
+        }
173
+
174
+        if ($remonte_pile) {
175
+            #	spip_logger()->info("On remonte vers $i");
176
+            // Sinon on remonte d'un cran
177
+            $idb = $boucles[$idb]->id_parent;
178
+            $i++;
179
+        } else {
180
+            $idb = null;
181
+        }
182
+    }
183
+
184
+    #	spip_logger()->info("Pas vu $nom_champ");
185
+    // esperons qu'il y sera
186
+    // ou qu'on a fourni une valeur par "defaut" plus pertinent
187
+    return index_compose($conditionnel, $defaut);
188 188
 }
189 189
 
190 190
 /**
@@ -198,12 +198,12 @@  discard block
 block discarded – undo
198 198
  * @return string              Code PHP complet de recherche d'un champ
199 199
  */
200 200
 function index_compose($conditionnel, $defaut) {
201
-	while ($c = array_pop($conditionnel)) {
202
-		// si on passe defaut = '', ne pas générer d'erreur de compilation.
203
-		$defaut = "($c:(" . ($defaut ?: "''") . '))';
204
-	}
201
+    while ($c = array_pop($conditionnel)) {
202
+        // si on passe defaut = '', ne pas générer d'erreur de compilation.
203
+        $defaut = "($c:(" . ($defaut ?: "''") . '))';
204
+    }
205 205
 
206
-	return $defaut;
206
+    return $defaut;
207 207
 }
208 208
 
209 209
 /**
@@ -239,98 +239,98 @@  discard block
 block discarded – undo
239 239
  **/
240 240
 function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) {
241 241
 
242
-	$r = $boucles[$idb]->type_requete;
243
-	// boucle recursive, c'est foutu...
244
-	if ($r == TYPE_RECURSIF) {
245
-		return [];
246
-	}
247
-	if (!$r) {
248
-		$joker = false; // indiquer a l'appelant
249
-		# continuer pour chercher l'erreur suivante
250
-		return ["'#" . $r . ':' . $nom_champ . "'", ''];
251
-	}
252
-
253
-	$desc = $boucles[$idb]->show;
254
-	// le nom du champ est il une exception de la table ? un alias ?
255
-	$excep = $GLOBALS['exceptions_des_tables'][$r] ?? '';
256
-	if ($excep) {
257
-		$excep = $excep[$nom_champ] ?? '';
258
-	}
259
-
260
-	// il y a un alias connu pour ce champ
261
-	if ($excep) {
262
-		$joker = false; // indiquer a l'appelant
263
-		return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
264
-	}
265
-
266
-	// le champ existe dans la table, on le prend.
267
-	if (isset($desc['field'][$nom_champ])) {
268
-		$t = $boucles[$idb]->id_table ?? '';
269
-		$joker = false; // indiquer a l'appelant
270
-		// note: dans certains cas ('valeur' d’une boucle DATA, sans id_table), retourne ['.valeur', 'valeur'] …
271
-		return ["$t.$nom_champ", $nom_champ];
272
-	}
273
-
274
-	// Tous les champs sont-ils acceptés ?
275
-	// Si oui, on retourne le champ, et on lève le flag joker
276
-	// C'est le cas des itérateurs DATA qui acceptent tout
277
-	// et testent la présence du champ à l'exécution et non à la compilation
278
-	// car ils ne connaissent pas ici leurs contenus.
279
-	if (
280
-		/*$joker AND */
281
-		isset($desc['field']['*'])
282
-	) {
283
-		$joker = true; // indiquer a l'appelant
284
-		return [$nom_champ, $nom_champ];
285
-	}
286
-
287
-	$joker = false; // indiquer a l'appelant
288
-
289
-	// la table de jointure est explicitement indiquée (rubrique.titre)
290
-	if (preg_match('/^(.*)\.(.*)$/', $nom_champ, $r)) {
291
-		[, $_table, $_nom_champ] = $r;
292
-		if ($cle = trouver_jointure_champ($_nom_champ, $boucles[$idb], [$_table])) {
293
-			$_alias = $cle . '_' . $_nom_champ;
294
-			return index_exception(
295
-				$boucles[$idb],
296
-				$desc,
297
-				$_alias,
298
-				[$_table, $_nom_champ]
299
-			);
300
-		}
301
-		return ['', ''];
302
-	}
303
-
304
-	// pas d'alias, pas de champ, pas de joker...
305
-	// tenter via une jointure...
306
-
307
-	// regarder si le champ est deja dans une jointure existante
308
-	// sinon, si il y a des joitures explicites, la construire
309
-	if (
310
-		!($t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]))
311
-		&& $boucles[$idb]->jointures_explicites
312
-	) {
313
-		// [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!!
314
-		// fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites
315
-		// mais est-ce ce qu'on veut ?
316
-		$jointures = preg_split('/\s+/', $boucles[$idb]->jointures_explicites);
317
-		if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) {
318
-			$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]);
319
-		}
320
-	}
321
-
322
-	if ($t) {
323
-		// si on a trouvé une jointure possible, on fait comme
324
-		// si c'était une exception pour le champ demandé
325
-		return index_exception(
326
-			$boucles[$idb],
327
-			$desc,
328
-			$nom_champ,
329
-			[$t[1]['id_table'], reset($t[2])]
330
-		);
331
-	}
332
-
333
-	return ['', ''];
242
+    $r = $boucles[$idb]->type_requete;
243
+    // boucle recursive, c'est foutu...
244
+    if ($r == TYPE_RECURSIF) {
245
+        return [];
246
+    }
247
+    if (!$r) {
248
+        $joker = false; // indiquer a l'appelant
249
+        # continuer pour chercher l'erreur suivante
250
+        return ["'#" . $r . ':' . $nom_champ . "'", ''];
251
+    }
252
+
253
+    $desc = $boucles[$idb]->show;
254
+    // le nom du champ est il une exception de la table ? un alias ?
255
+    $excep = $GLOBALS['exceptions_des_tables'][$r] ?? '';
256
+    if ($excep) {
257
+        $excep = $excep[$nom_champ] ?? '';
258
+    }
259
+
260
+    // il y a un alias connu pour ce champ
261
+    if ($excep) {
262
+        $joker = false; // indiquer a l'appelant
263
+        return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
264
+    }
265
+
266
+    // le champ existe dans la table, on le prend.
267
+    if (isset($desc['field'][$nom_champ])) {
268
+        $t = $boucles[$idb]->id_table ?? '';
269
+        $joker = false; // indiquer a l'appelant
270
+        // note: dans certains cas ('valeur' d’une boucle DATA, sans id_table), retourne ['.valeur', 'valeur'] …
271
+        return ["$t.$nom_champ", $nom_champ];
272
+    }
273
+
274
+    // Tous les champs sont-ils acceptés ?
275
+    // Si oui, on retourne le champ, et on lève le flag joker
276
+    // C'est le cas des itérateurs DATA qui acceptent tout
277
+    // et testent la présence du champ à l'exécution et non à la compilation
278
+    // car ils ne connaissent pas ici leurs contenus.
279
+    if (
280
+        /*$joker AND */
281
+        isset($desc['field']['*'])
282
+    ) {
283
+        $joker = true; // indiquer a l'appelant
284
+        return [$nom_champ, $nom_champ];
285
+    }
286
+
287
+    $joker = false; // indiquer a l'appelant
288
+
289
+    // la table de jointure est explicitement indiquée (rubrique.titre)
290
+    if (preg_match('/^(.*)\.(.*)$/', $nom_champ, $r)) {
291
+        [, $_table, $_nom_champ] = $r;
292
+        if ($cle = trouver_jointure_champ($_nom_champ, $boucles[$idb], [$_table])) {
293
+            $_alias = $cle . '_' . $_nom_champ;
294
+            return index_exception(
295
+                $boucles[$idb],
296
+                $desc,
297
+                $_alias,
298
+                [$_table, $_nom_champ]
299
+            );
300
+        }
301
+        return ['', ''];
302
+    }
303
+
304
+    // pas d'alias, pas de champ, pas de joker...
305
+    // tenter via une jointure...
306
+
307
+    // regarder si le champ est deja dans une jointure existante
308
+    // sinon, si il y a des joitures explicites, la construire
309
+    if (
310
+        !($t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]))
311
+        && $boucles[$idb]->jointures_explicites
312
+    ) {
313
+        // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!!
314
+        // fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites
315
+        // mais est-ce ce qu'on veut ?
316
+        $jointures = preg_split('/\s+/', $boucles[$idb]->jointures_explicites);
317
+        if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) {
318
+            $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]);
319
+        }
320
+    }
321
+
322
+    if ($t) {
323
+        // si on a trouvé une jointure possible, on fait comme
324
+        // si c'était une exception pour le champ demandé
325
+        return index_exception(
326
+            $boucles[$idb],
327
+            $desc,
328
+            $nom_champ,
329
+            [$t[1]['id_table'], reset($t[2])]
330
+        );
331
+    }
332
+
333
+    return ['', ''];
334 334
 }
335 335
 
336 336
 
@@ -358,52 +358,52 @@  discard block
 block discarded – undo
358 358
  *     est une expression pour le SELECT de la boucle du style "mots.titre AS titre_mot"
359 359
  **/
360 360
 function index_exception(&$boucle, $desc, $nom_champ, $excep) {
361
-	static $trouver_table;
362
-	if (!$trouver_table) {
363
-		$trouver_table = charger_fonction('trouver_table', 'base');
364
-	}
365
-
366
-	if (is_array($excep)) {
367
-		// permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
368
-		$t = null;
369
-		if (count($excep) == 3) {
370
-			$index_exception_derogatoire = array_pop($excep);
371
-			$t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
372
-		}
373
-		if ($t == null) {
374
-			[$e, $x] = $excep;  #PHP4 affecte de gauche a droite
375
-			$excep = $x;    #PHP5 de droite a gauche !
376
-			$j = $trouver_table($e, $boucle->sql_serveur);
377
-			if (!$j) {
378
-				return ['', ''];
379
-			}
380
-			$e = $j['table'];
381
-			if (!$t = array_search($e, $boucle->from)) {
382
-				$k = $j['key']['PRIMARY KEY'];
383
-				if (strpos($k, ',')) {
384
-					$l = (preg_split('/\s*,\s*/', $k));
385
-					$k = $desc['key']['PRIMARY KEY'];
386
-					if (!in_array($k, $l)) {
387
-						spip_logger()->info("jointure impossible $e " . implode(',', $l));
388
-
389
-						return ['', ''];
390
-					}
391
-				}
392
-				$k = [$boucle->id_table, [$e], $k];
393
-				fabrique_jointures($boucle, [$k]);
394
-				$t = array_search($e, $boucle->from);
395
-			}
396
-		}
397
-	} else {
398
-		$t = $boucle->id_table;
399
-	}
400
-	// demander a SQL de gerer le synonyme
401
-	// ca permet que excep soit dynamique (Cedric, 2/3/06)
402
-	if ($excep != $nom_champ) {
403
-		$excep .= ' AS ' . $nom_champ;
404
-	}
405
-
406
-	return ["$t.$excep", $nom_champ];
361
+    static $trouver_table;
362
+    if (!$trouver_table) {
363
+        $trouver_table = charger_fonction('trouver_table', 'base');
364
+    }
365
+
366
+    if (is_array($excep)) {
367
+        // permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
368
+        $t = null;
369
+        if (count($excep) == 3) {
370
+            $index_exception_derogatoire = array_pop($excep);
371
+            $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
372
+        }
373
+        if ($t == null) {
374
+            [$e, $x] = $excep;  #PHP4 affecte de gauche a droite
375
+            $excep = $x;    #PHP5 de droite a gauche !
376
+            $j = $trouver_table($e, $boucle->sql_serveur);
377
+            if (!$j) {
378
+                return ['', ''];
379
+            }
380
+            $e = $j['table'];
381
+            if (!$t = array_search($e, $boucle->from)) {
382
+                $k = $j['key']['PRIMARY KEY'];
383
+                if (strpos($k, ',')) {
384
+                    $l = (preg_split('/\s*,\s*/', $k));
385
+                    $k = $desc['key']['PRIMARY KEY'];
386
+                    if (!in_array($k, $l)) {
387
+                        spip_logger()->info("jointure impossible $e " . implode(',', $l));
388
+
389
+                        return ['', ''];
390
+                    }
391
+                }
392
+                $k = [$boucle->id_table, [$e], $k];
393
+                fabrique_jointures($boucle, [$k]);
394
+                $t = array_search($e, $boucle->from);
395
+            }
396
+        }
397
+    } else {
398
+        $t = $boucle->id_table;
399
+    }
400
+    // demander a SQL de gerer le synonyme
401
+    // ca permet que excep soit dynamique (Cedric, 2/3/06)
402
+    if ($excep != $nom_champ) {
403
+        $excep .= ' AS ' . $nom_champ;
404
+    }
405
+
406
+    return ["$t.$excep", $nom_champ];
407 407
 }
408 408
 
409 409
 /**
@@ -428,7 +428,7 @@  discard block
 block discarded – undo
428 428
  *     Code PHP pour retrouver le champ
429 429
  */
430 430
 function champ_sql($champ, $p, $defaut = null, $remonte_pile = true) {
431
-	return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile);
431
+    return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile);
432 432
 }
433 433
 
434 434
 
@@ -448,9 +448,9 @@  discard block
 block discarded – undo
448 448
  *     Code PHP pour d'exécution de la balise et de ses filtres
449 449
  **/
450 450
 function calculer_champ($p) {
451
-	$p = calculer_balise($p->nom_champ, $p);
451
+    $p = calculer_balise($p->nom_champ, $p);
452 452
 
453
-	return applique_filtres($p);
453
+    return applique_filtres($p);
454 454
 }
455 455
 
456 456
 
@@ -487,26 +487,26 @@  discard block
 block discarded – undo
487 487
  **/
488 488
 function calculer_balise(string $nom, Champ $p): Champ {
489 489
 
490
-	// S'agit-t-il d'une balise_XXXX[_dist]() ?
491
-	if ($f = charger_fonction($nom, 'balise', true)) {
492
-		$p->balise_calculee = true;
493
-		$res = $f($p);
494
-		if ($res !== null && is_object($res)) {
495
-			return $res;
496
-		}
497
-	}
498
-
499
-	// Certaines des balises comportant un _ sont generiques
500
-	if ($balise_generique = chercher_balise_generique($nom)) {
501
-		$res = $balise_generique['fonction_generique']($p);
502
-		if ($res !== null && is_object($res)) {
503
-			return $res;
504
-		}
505
-	}
506
-
507
-	$f = charger_fonction('DEFAUT', 'calculer_balise');
508
-
509
-	return $f($nom, $p);
490
+    // S'agit-t-il d'une balise_XXXX[_dist]() ?
491
+    if ($f = charger_fonction($nom, 'balise', true)) {
492
+        $p->balise_calculee = true;
493
+        $res = $f($p);
494
+        if ($res !== null && is_object($res)) {
495
+            return $res;
496
+        }
497
+    }
498
+
499
+    // Certaines des balises comportant un _ sont generiques
500
+    if ($balise_generique = chercher_balise_generique($nom)) {
501
+        $res = $balise_generique['fonction_generique']($p);
502
+        if ($res !== null && is_object($res)) {
503
+            return $res;
504
+        }
505
+    }
506
+
507
+    $f = charger_fonction('DEFAUT', 'calculer_balise');
508
+
509
+    return $f($nom, $p);
510 510
 }
511 511
 
512 512
 
@@ -534,33 +534,33 @@  discard block
 block discarded – undo
534 534
  **/
535 535
 function calculer_balise_DEFAUT_dist($nom, $p) {
536 536
 
537
-	// ca pourrait etre un champ SQL homonyme,
538
-	$p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle);
539
-
540
-	// compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
541
-	// il faut recracher {...} quand ce n'est finalement pas des args
542
-	if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) {
543
-		$code = addslashes($p->fonctions[0][1]);
544
-		$p->code .= " . '$code'";
545
-	}
546
-
547
-	// ne pas passer le filtre securite sur les id_xxx
548
-	if (str_starts_with($nom, 'ID_')) {
549
-		$p->interdire_scripts = false;
550
-	}
551
-
552
-	// Compatibilite ascendante avec les couleurs html (#FEFEFE) :
553
-	// SI le champ SQL n'est pas trouve
554
-	// ET si la balise a une forme de couleur
555
-	// ET s'il n'y a ni filtre ni etoile
556
-	// ALORS retourner la couleur.
557
-	// Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)]
558
-	if (preg_match('/^[A-F]{1,6}$/i', $nom) && !$p->etoile && !$p->fonctions) {
559
-		$p->code = "'#$nom'";
560
-		$p->interdire_scripts = false;
561
-	}
562
-
563
-	return $p;
537
+    // ca pourrait etre un champ SQL homonyme,
538
+    $p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle);
539
+
540
+    // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
541
+    // il faut recracher {...} quand ce n'est finalement pas des args
542
+    if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) {
543
+        $code = addslashes($p->fonctions[0][1]);
544
+        $p->code .= " . '$code'";
545
+    }
546
+
547
+    // ne pas passer le filtre securite sur les id_xxx
548
+    if (str_starts_with($nom, 'ID_')) {
549
+        $p->interdire_scripts = false;
550
+    }
551
+
552
+    // Compatibilite ascendante avec les couleurs html (#FEFEFE) :
553
+    // SI le champ SQL n'est pas trouve
554
+    // ET si la balise a une forme de couleur
555
+    // ET s'il n'y a ni filtre ni etoile
556
+    // ALORS retourner la couleur.
557
+    // Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)]
558
+    if (preg_match('/^[A-F]{1,6}$/i', $nom) && !$p->etoile && !$p->fonctions) {
559
+        $p->code = "'#$nom'";
560
+        $p->interdire_scripts = false;
561
+    }
562
+
563
+    return $p;
564 564
 }
565 565
 
566 566
 
@@ -608,52 +608,52 @@  discard block
 block discarded – undo
608 608
  **/
609 609
 function calculer_balise_dynamique($p, $nom, $l, $supp = []) {
610 610
 
611
-	if (!balise_distante_interdite($p)) {
612
-		$p->code = "''";
613
-
614
-		return $p;
615
-	}
616
-	// compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
617
-	// il faut recracher {...} quand ce n'est finalement pas des args
618
-	if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) {
619
-		$p->fonctions = [];
620
-	}
621
-
622
-	if ($p->param && ($c = $p->param[0])) {
623
-		// liste d'arguments commence toujours par la chaine vide
624
-		array_shift($c);
625
-		// construire la liste d'arguments comme pour un filtre
626
-		$param = compose_filtres_args($p, $c, ',');
627
-	} else {
628
-		$param = '';
629
-	}
630
-	$collecte = collecter_balise_dynamique($l, $p, $nom);
631
-
632
-	$dans_un_modele = false;
633
-	if (
634
-		!empty($p->descr['sourcefile']) && ($f = $p->descr['sourcefile']) && basename(dirname($f)) === 'modeles'
635
-	) {
636
-		$dans_un_modele = true;
637
-	}
638
-
639
-	// un modele est toujours inséré en texte dans son contenant
640
-	// donc si on est dans le public avec un cache on va perdre le dynamisme
641
-	// et on risque de mettre en cache les valeurs pre-remplies du formulaire
642
-	// on passe donc par une fonction proxy qui si besoin va collecter les arguments
643
-	// et injecter le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
644
-	// (dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave))
645
-	$p->code = sprintf(
646
-		$dans_un_modele ? CODE_EXECUTER_BALISE_MODELE : CODE_EXECUTER_BALISE,
647
-		$nom,
648
-		implode(',', $collecte),
649
-		($collecte ? $param : substr($param, 1)), # virer la virgule
650
-		memoriser_contexte_compil($p),
651
-		($supp ? ', ' . implode(',', $supp) : (''))
652
-	);
653
-
654
-	$p->interdire_scripts = false;
655
-
656
-	return $p;
611
+    if (!balise_distante_interdite($p)) {
612
+        $p->code = "''";
613
+
614
+        return $p;
615
+    }
616
+    // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
617
+    // il faut recracher {...} quand ce n'est finalement pas des args
618
+    if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) {
619
+        $p->fonctions = [];
620
+    }
621
+
622
+    if ($p->param && ($c = $p->param[0])) {
623
+        // liste d'arguments commence toujours par la chaine vide
624
+        array_shift($c);
625
+        // construire la liste d'arguments comme pour un filtre
626
+        $param = compose_filtres_args($p, $c, ',');
627
+    } else {
628
+        $param = '';
629
+    }
630
+    $collecte = collecter_balise_dynamique($l, $p, $nom);
631
+
632
+    $dans_un_modele = false;
633
+    if (
634
+        !empty($p->descr['sourcefile']) && ($f = $p->descr['sourcefile']) && basename(dirname($f)) === 'modeles'
635
+    ) {
636
+        $dans_un_modele = true;
637
+    }
638
+
639
+    // un modele est toujours inséré en texte dans son contenant
640
+    // donc si on est dans le public avec un cache on va perdre le dynamisme
641
+    // et on risque de mettre en cache les valeurs pre-remplies du formulaire
642
+    // on passe donc par une fonction proxy qui si besoin va collecter les arguments
643
+    // et injecter le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
644
+    // (dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave))
645
+    $p->code = sprintf(
646
+        $dans_un_modele ? CODE_EXECUTER_BALISE_MODELE : CODE_EXECUTER_BALISE,
647
+        $nom,
648
+        implode(',', $collecte),
649
+        ($collecte ? $param : substr($param, 1)), # virer la virgule
650
+        memoriser_contexte_compil($p),
651
+        ($supp ? ', ' . implode(',', $supp) : (''))
652
+    );
653
+
654
+    $p->interdire_scripts = false;
655
+
656
+    return $p;
657 657
 }
658 658
 
659 659
 
@@ -683,17 +683,17 @@  discard block
 block discarded – undo
683 683
  *     Liste des codes PHP d'éxecution des balises collectées
684 684
  **/
685 685
 function collecter_balise_dynamique(array $l, Champ &$p, string $nom): array {
686
-	$args = [];
687
-	foreach ($l as $c) {
688
-		if ($c === null) {
689
-			$args[] = 'null';
690
-		} else {
691
-			$x = calculer_balise($c, $p);
692
-			$args[] = $x->code;
693
-		}
694
-	}
695
-
696
-	return $args;
686
+    $args = [];
687
+    foreach ($l as $c) {
688
+        if ($c === null) {
689
+            $args[] = 'null';
690
+        } else {
691
+            $x = calculer_balise($c, $p);
692
+            $args[] = $x->code;
693
+        }
694
+    }
695
+
696
+    return $args;
697 697
 }
698 698
 
699 699
 
@@ -708,19 +708,19 @@  discard block
 block discarded – undo
708 708
  *     Nom de la connexion
709 709
  **/
710 710
 function trouver_nom_serveur_distant($p) {
711
-	$nom = $p->id_boucle;
712
-	if (
713
-		$nom && isset($p->boucles[$nom])
714
-	) {
715
-		$s = $p->boucles[$nom]->sql_serveur;
716
-		if (
717
-			strlen($s) && strlen($serveur = strtolower($s)) && !in_array($serveur, $GLOBALS['exception_des_connect'])
718
-		) {
719
-			return $serveur;
720
-		}
721
-	}
722
-
723
-	return '';
711
+    $nom = $p->id_boucle;
712
+    if (
713
+        $nom && isset($p->boucles[$nom])
714
+    ) {
715
+        $s = $p->boucles[$nom]->sql_serveur;
716
+        if (
717
+            strlen($s) && strlen($serveur = strtolower($s)) && !in_array($serveur, $GLOBALS['exception_des_connect'])
718
+        ) {
719
+            return $serveur;
720
+        }
721
+    }
722
+
723
+    return '';
724 724
 }
725 725
 
726 726
 
@@ -744,15 +744,15 @@  discard block
 block discarded – undo
744 744
  *     - false : La balise est interdite car le serveur est distant
745 745
  **/
746 746
 function balise_distante_interdite($p) {
747
-	$nom = $p->id_boucle;
747
+    $nom = $p->id_boucle;
748 748
 
749
-	if ($nom && trouver_nom_serveur_distant($p)) {
750
-		spip_logger()->info($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
749
+    if ($nom && trouver_nom_serveur_distant($p)) {
750
+        spip_logger()->info($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
751 751
 
752
-		return false;
753
-	}
752
+        return false;
753
+    }
754 754
 
755
-	return true;
755
+    return true;
756 756
 }
757 757
 
758 758
 
@@ -762,75 +762,75 @@  discard block
 block discarded – undo
762 762
 //
763 763
 function champs_traitements($p) {
764 764
 
765
-	if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) {
766
-		$ps = $GLOBALS['table_des_traitements'][$p->nom_champ];
767
-	} else {
768
-		// quand on utilise un traitement catch-all *
769
-		// celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer
770
-		// leur propre securite
771
-		$ps = $p->balise_calculee ? false : $GLOBALS['table_des_traitements']['*'];
772
-	}
773
-
774
-	if (is_array($ps)) {
775
-		// Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte
776
-		$idb = index_boucle($p);
777
-		// si le champ a ete trouve dans une boucle parente sa source est renseignee ici
778
-		if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) {
779
-			$idb = $p->boucles[$idb]->index_champ[$p->nom_champ];
780
-		}
781
-
782
-		// mais on peut aussi etre hors boucle. Se mefier.
783
-		$type_requete = $p->boucles[$idb]->type_requete ?? false;
784
-		$table_sql = $p->boucles[$idb]->show['table_sql'] ?? false;
785
-
786
-		// bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.)
787
-		if ($type_requete && isset($GLOBALS['table_des_tables'][$type_requete])) {
788
-			$type_alias = $type_requete;
789
-			$type_requete = $GLOBALS['table_des_tables'][$type_requete];
790
-		} else {
791
-			$type_alias = false;
792
-		}
793
-
794
-		// le traitement peut n'etre defini que pour une table en particulier "spip_articles"
795
-		if ($table_sql && isset($ps[$table_sql])) {
796
-			$ps = $ps[$table_sql];
797
-		} // ou pour une boucle en particulier "DATA","articles"
798
-		elseif ($type_requete && isset($ps[$type_requete])) {
799
-			$ps = $ps[$type_requete];
800
-		} // ou pour une boucle utilisant un alias ("hierarchie")
801
-		elseif ($type_alias && isset($ps[$type_alias])) {
802
-			$ps = $ps[$type_alias];
803
-		} // ou pour indifféremment quelle que soit la boucle
804
-		elseif (isset($ps[0])) {
805
-			$ps = $ps[0];
806
-		} else {
807
-			$ps = false;
808
-		}
809
-	}
810
-
811
-	if (!$ps) {
812
-		return $p->code;
813
-	}
814
-
815
-	// Si une boucle DOCUMENTS{doublons} est presente dans le squelette,
816
-	// ou si in INCLURE contient {doublons}
817
-	// on insere une fonction de remplissage du tableau des doublons
818
-	// dans les filtres propre() ou typo()
819
-	// (qui traitent les raccourcis <docXX> referencant les docs)
820
-
821
-	if (
822
-		isset($p->descr['documents'])
823
-		&& $p->descr['documents']
824
-		&& (str_contains($ps, 'propre') || str_contains($ps, 'typo'))
825
-	) {
826
-		$ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
827
-	}
828
-
829
-	// La protection des champs par |safehtml est assuree par les extensions
830
-	// dans la declaration des traitements des champs sensibles
831
-
832
-	// Remplacer enfin le placeholder %s par le vrai code de la balise
833
-	return str_replace('%s', $p->code, $ps);
765
+    if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) {
766
+        $ps = $GLOBALS['table_des_traitements'][$p->nom_champ];
767
+    } else {
768
+        // quand on utilise un traitement catch-all *
769
+        // celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer
770
+        // leur propre securite
771
+        $ps = $p->balise_calculee ? false : $GLOBALS['table_des_traitements']['*'];
772
+    }
773
+
774
+    if (is_array($ps)) {
775
+        // Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte
776
+        $idb = index_boucle($p);
777
+        // si le champ a ete trouve dans une boucle parente sa source est renseignee ici
778
+        if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) {
779
+            $idb = $p->boucles[$idb]->index_champ[$p->nom_champ];
780
+        }
781
+
782
+        // mais on peut aussi etre hors boucle. Se mefier.
783
+        $type_requete = $p->boucles[$idb]->type_requete ?? false;
784
+        $table_sql = $p->boucles[$idb]->show['table_sql'] ?? false;
785
+
786
+        // bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.)
787
+        if ($type_requete && isset($GLOBALS['table_des_tables'][$type_requete])) {
788
+            $type_alias = $type_requete;
789
+            $type_requete = $GLOBALS['table_des_tables'][$type_requete];
790
+        } else {
791
+            $type_alias = false;
792
+        }
793
+
794
+        // le traitement peut n'etre defini que pour une table en particulier "spip_articles"
795
+        if ($table_sql && isset($ps[$table_sql])) {
796
+            $ps = $ps[$table_sql];
797
+        } // ou pour une boucle en particulier "DATA","articles"
798
+        elseif ($type_requete && isset($ps[$type_requete])) {
799
+            $ps = $ps[$type_requete];
800
+        } // ou pour une boucle utilisant un alias ("hierarchie")
801
+        elseif ($type_alias && isset($ps[$type_alias])) {
802
+            $ps = $ps[$type_alias];
803
+        } // ou pour indifféremment quelle que soit la boucle
804
+        elseif (isset($ps[0])) {
805
+            $ps = $ps[0];
806
+        } else {
807
+            $ps = false;
808
+        }
809
+    }
810
+
811
+    if (!$ps) {
812
+        return $p->code;
813
+    }
814
+
815
+    // Si une boucle DOCUMENTS{doublons} est presente dans le squelette,
816
+    // ou si in INCLURE contient {doublons}
817
+    // on insere une fonction de remplissage du tableau des doublons
818
+    // dans les filtres propre() ou typo()
819
+    // (qui traitent les raccourcis <docXX> referencant les docs)
820
+
821
+    if (
822
+        isset($p->descr['documents'])
823
+        && $p->descr['documents']
824
+        && (str_contains($ps, 'propre') || str_contains($ps, 'typo'))
825
+    ) {
826
+        $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
827
+    }
828
+
829
+    // La protection des champs par |safehtml est assuree par les extensions
830
+    // dans la declaration des traitements des champs sensibles
831
+
832
+    // Remplacer enfin le placeholder %s par le vrai code de la balise
833
+    return str_replace('%s', $p->code, $ps);
834 834
 }
835 835
 
836 836
 
@@ -842,95 +842,95 @@  discard block
 block discarded – undo
842 842
 //
843 843
 function applique_filtres($p) {
844 844
 
845
-	// Traitements standards (cf. supra)
846
-	$code = $p->etoile == '' ? champs_traitements($p) : $p->code;
845
+    // Traitements standards (cf. supra)
846
+    $code = $p->etoile == '' ? champs_traitements($p) : $p->code;
847 847
 
848
-	// Appliquer les filtres perso
849
-	if ($p->param) {
850
-		$code = compose_filtres($p, $code);
851
-	}
848
+    // Appliquer les filtres perso
849
+    if ($p->param) {
850
+        $code = compose_filtres($p, $code);
851
+    }
852 852
 
853
-	// S'il y a un lien avec la session, ajouter un code qui levera
854
-	// un drapeau dans la structure d'invalidation $Cache
855
-	if (isset($p->descr['session'])) {
856
-		$code = "invalideur_session(\$Cache, $code)";
857
-	}
853
+    // S'il y a un lien avec la session, ajouter un code qui levera
854
+    // un drapeau dans la structure d'invalidation $Cache
855
+    if (isset($p->descr['session'])) {
856
+        $code = "invalideur_session(\$Cache, $code)";
857
+    }
858 858
 
859
-	return sandbox_composer_interdire_scripts($code, $p);
859
+    return sandbox_composer_interdire_scripts($code, $p);
860 860
 }
861 861
 
862 862
 // Cf. function pipeline dans ecrire/inc_utils.php
863 863
 function compose_filtres(&$p, $code) {
864 864
 
865
-	$image_miette = false;
866
-	foreach ($p->param as $filtre) {
867
-		$fonc = array_shift($filtre);
868
-		if (!$fonc) {
869
-			continue;
870
-		} // normalement qu'au premier tour.
871
-		$is_filtre_image = (str_starts_with($fonc, 'image_') && $fonc != 'image_graver');
872
-		if ($image_miette && !$is_filtre_image) {
873
-			// il faut graver maintenant car apres le filtre en cours
874
-			// on est pas sur d'avoir encore le nom du fichier dans le pipe
875
-			$code = "filtrer('image_graver', $code)";
876
-			$image_miette = false;
877
-		}
878
-
879
-		// recuperer les arguments du filtre,
880
-		// a separer par "," ou ":" dans le cas du filtre "?{a,b}"
881
-		$countfiltre = is_countable($filtre) ? count($filtre) : 0;
882
-		if ($fonc !== '?') {
883
-			$sep = ',';
884
-		} else {
885
-			$sep = ':';
886
-			// |?{a,b} *doit* avoir exactement 2 arguments ; on les force
887
-			if ($countfiltre != 2) {
888
-				$filtre = [$filtre[0] ?? '', $filtre[1] ?? ''];
889
-				$countfiltre = 2;
890
-			}
891
-		}
892
-		$arglist = compose_filtres_args($p, $filtre, $sep);
893
-		$logique = filtre_logique($fonc, $code, substr($arglist, 1));
894
-		if ($logique) {
895
-			$code = $logique;
896
-		} else {
897
-			$code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre);
898
-			if ($is_filtre_image) {
899
-				$image_miette = true;
900
-			}
901
-		}
902
-	}
903
-	// ramasser les images intermediaires inutiles et graver l'image finale
904
-	if ($image_miette) {
905
-		$code = "filtrer('image_graver',$code)";
906
-	}
907
-
908
-	return $code;
865
+    $image_miette = false;
866
+    foreach ($p->param as $filtre) {
867
+        $fonc = array_shift($filtre);
868
+        if (!$fonc) {
869
+            continue;
870
+        } // normalement qu'au premier tour.
871
+        $is_filtre_image = (str_starts_with($fonc, 'image_') && $fonc != 'image_graver');
872
+        if ($image_miette && !$is_filtre_image) {
873
+            // il faut graver maintenant car apres le filtre en cours
874
+            // on est pas sur d'avoir encore le nom du fichier dans le pipe
875
+            $code = "filtrer('image_graver', $code)";
876
+            $image_miette = false;
877
+        }
878
+
879
+        // recuperer les arguments du filtre,
880
+        // a separer par "," ou ":" dans le cas du filtre "?{a,b}"
881
+        $countfiltre = is_countable($filtre) ? count($filtre) : 0;
882
+        if ($fonc !== '?') {
883
+            $sep = ',';
884
+        } else {
885
+            $sep = ':';
886
+            // |?{a,b} *doit* avoir exactement 2 arguments ; on les force
887
+            if ($countfiltre != 2) {
888
+                $filtre = [$filtre[0] ?? '', $filtre[1] ?? ''];
889
+                $countfiltre = 2;
890
+            }
891
+        }
892
+        $arglist = compose_filtres_args($p, $filtre, $sep);
893
+        $logique = filtre_logique($fonc, $code, substr($arglist, 1));
894
+        if ($logique) {
895
+            $code = $logique;
896
+        } else {
897
+            $code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre);
898
+            if ($is_filtre_image) {
899
+                $image_miette = true;
900
+            }
901
+        }
902
+    }
903
+    // ramasser les images intermediaires inutiles et graver l'image finale
904
+    if ($image_miette) {
905
+        $code = "filtrer('image_graver',$code)";
906
+    }
907
+
908
+    return $code;
909 909
 }
910 910
 
911 911
 // Filtres et,ou,oui,non,sinon,xou,xor,and,or,not,yes
912 912
 // et comparateurs
913 913
 function filtre_logique($fonc, $code, $arg) {
914
-	return match (true) {
915
-		in_array($fonc, $GLOBALS['table_criteres_infixes']) => "($code $fonc $arg)",
916
-		$fonc == 'and' || $fonc == 'et' => "((($code) AND ($arg)) ?' ' :'')",
917
-		$fonc == 'or' || $fonc == 'ou' => "((($code) OR ($arg)) ?' ' :'')",
918
-		$fonc == 'xor' || $fonc == 'xou' => "((($code) XOR ($arg)) ?' ' :'')",
919
-		$fonc == 'sinon' => "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)",
920
-		$fonc == 'not' || $fonc == 'non' => "(($code) ?'' :' ')",
921
-		$fonc == 'yes' || $fonc == 'oui' => "(($code) ?' ' :'')",
922
-		default => '',
923
-	};
914
+    return match (true) {
915
+        in_array($fonc, $GLOBALS['table_criteres_infixes']) => "($code $fonc $arg)",
916
+        $fonc == 'and' || $fonc == 'et' => "((($code) AND ($arg)) ?' ' :'')",
917
+        $fonc == 'or' || $fonc == 'ou' => "((($code) OR ($arg)) ?' ' :'')",
918
+        $fonc == 'xor' || $fonc == 'xou' => "((($code) XOR ($arg)) ?' ' :'')",
919
+        $fonc == 'sinon' => "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)",
920
+        $fonc == 'not' || $fonc == 'non' => "(($code) ?'' :' ')",
921
+        $fonc == 'yes' || $fonc == 'oui' => "(($code) ?' ' :'')",
922
+        default => '',
923
+    };
924 924
 }
925 925
 
926 926
 function compose_filtres_args($p, $args, $sep) {
927
-	$arglist = '';
928
-	foreach ($args as $arg) {
929
-		$arglist .= $sep .
930
-			calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
931
-	}
927
+    $arglist = '';
928
+    foreach ($args as $arg) {
929
+        $arglist .= $sep .
930
+            calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
931
+    }
932 932
 
933
-	return $arglist;
933
+    return $arglist;
934 934
 }
935 935
 
936 936
 
@@ -948,15 +948,15 @@  discard block
 block discarded – undo
948 948
  **/
949 949
 function calculer_argument_precedent($idb, $nom_champ, &$boucles, $defaut = null) {
950 950
 
951
-	// si recursif, forcer l'extraction du champ SQL mais ignorer le code
952
-	if ($boucles[$idb]->externe) {
953
-		index_pile($idb, $nom_champ, $boucles, '', $defaut);
954
-		// retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle
955
-		// on ignore le defaut fourni dans ce cas
956
-		$defaut = "(\$Pile[\$SP]['$nom_champ'] ?? null)";
957
-	}
951
+    // si recursif, forcer l'extraction du champ SQL mais ignorer le code
952
+    if ($boucles[$idb]->externe) {
953
+        index_pile($idb, $nom_champ, $boucles, '', $defaut);
954
+        // retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle
955
+        // on ignore le defaut fourni dans ce cas
956
+        $defaut = "(\$Pile[\$SP]['$nom_champ'] ?? null)";
957
+    }
958 958
 
959
-	return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut);
959
+    return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut);
960 960
 }
961 961
 
962 962
 //
@@ -970,30 +970,30 @@  discard block
 block discarded – undo
970 970
 //
971 971
 
972 972
 function rindex_pile($p, $champ, $motif) {
973
-	$n = 0;
974
-	$b = $p->id_boucle;
975
-	$p->code = '';
976
-	while ($b != '') {
977
-		foreach ($p->boucles[$b]->criteres as $critere) {
978
-			if ($critere->op == $motif) {
979
-				$p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") .
980
-					"]['$champ']";
981
-				$b = '';
982
-				break 2;
983
-			}
984
-		}
985
-		$n++;
986
-		$b = $p->boucles[$b]->id_parent;
987
-	}
988
-
989
-	// si on est hors d'une boucle de {recherche}, cette balise est vide
990
-	if (!$p->code) {
991
-		$p->code = "''";
992
-	}
993
-
994
-	$p->interdire_scripts = false;
995
-
996
-	return $p;
973
+    $n = 0;
974
+    $b = $p->id_boucle;
975
+    $p->code = '';
976
+    while ($b != '') {
977
+        foreach ($p->boucles[$b]->criteres as $critere) {
978
+            if ($critere->op == $motif) {
979
+                $p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") .
980
+                    "]['$champ']";
981
+                $b = '';
982
+                break 2;
983
+            }
984
+        }
985
+        $n++;
986
+        $b = $p->boucles[$b]->id_parent;
987
+    }
988
+
989
+    // si on est hors d'une boucle de {recherche}, cette balise est vide
990
+    if (!$p->code) {
991
+        $p->code = "''";
992
+    }
993
+
994
+    $p->interdire_scripts = false;
995
+
996
+    return $p;
997 997
 }
998 998
 
999 999
 /**
@@ -1003,7 +1003,7 @@  discard block
 block discarded – undo
1003 1003
  * @return string Nom de la balise, avec indication de boucle explicite si présent.
1004 1004
  */
1005 1005
 function zbug_presenter_champ($p, $champ = '') {
1006
-	$balise = $champ ?: $p->nom_champ;
1007
-	$explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
1008
-	return "#{$explicite}{$balise}";
1006
+    $balise = $champ ?: $p->nom_champ;
1007
+    $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
1008
+    return "#{$explicite}{$balise}";
1009 1009
 }
Please login to merge, or discard this patch.
Spacing   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -126,7 +126,7 @@  discard block
 block discarded – undo
126 126
 	$select = true
127 127
 ) {
128 128
 	if (!is_string($defaut)) {
129
-		$defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)';
129
+		$defaut = '($Pile[0][\''.strtolower($nom_champ).'\'] ?? null)';
130 130
 	}
131 131
 
132 132
 	$idb_origine = $idb;
@@ -159,7 +159,7 @@  discard block
 block discarded – undo
159 159
 			}
160 160
 			// renseigner la boucle source de ce champ pour les traitements
161 161
 			$boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb;
162
-			$champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']';
162
+			$champ = '$Pile[$SP'.($i ? "-$i" : '').'][\''.$c.'\']';
163 163
 			if (!$joker) {
164 164
 				return index_compose($conditionnel, $champ);
165 165
 			}
@@ -200,7 +200,7 @@  discard block
 block discarded – undo
200 200
 function index_compose($conditionnel, $defaut) {
201 201
 	while ($c = array_pop($conditionnel)) {
202 202
 		// si on passe defaut = '', ne pas générer d'erreur de compilation.
203
-		$defaut = "($c:(" . ($defaut ?: "''") . '))';
203
+		$defaut = "($c:(".($defaut ?: "''").'))';
204 204
 	}
205 205
 
206 206
 	return $defaut;
@@ -247,7 +247,7 @@  discard block
 block discarded – undo
247 247
 	if (!$r) {
248 248
 		$joker = false; // indiquer a l'appelant
249 249
 		# continuer pour chercher l'erreur suivante
250
-		return ["'#" . $r . ':' . $nom_champ . "'", ''];
250
+		return ["'#".$r.':'.$nom_champ."'", ''];
251 251
 	}
252 252
 
253 253
 	$desc = $boucles[$idb]->show;
@@ -290,7 +290,7 @@  discard block
 block discarded – undo
290 290
 	if (preg_match('/^(.*)\.(.*)$/', $nom_champ, $r)) {
291 291
 		[, $_table, $_nom_champ] = $r;
292 292
 		if ($cle = trouver_jointure_champ($_nom_champ, $boucles[$idb], [$_table])) {
293
-			$_alias = $cle . '_' . $_nom_champ;
293
+			$_alias = $cle.'_'.$_nom_champ;
294 294
 			return index_exception(
295 295
 				$boucles[$idb],
296 296
 				$desc,
@@ -371,8 +371,8 @@  discard block
 block discarded – undo
371 371
 			$t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
372 372
 		}
373 373
 		if ($t == null) {
374
-			[$e, $x] = $excep;  #PHP4 affecte de gauche a droite
375
-			$excep = $x;    #PHP5 de droite a gauche !
374
+			[$e, $x] = $excep; #PHP4 affecte de gauche a droite
375
+			$excep = $x; #PHP5 de droite a gauche !
376 376
 			$j = $trouver_table($e, $boucle->sql_serveur);
377 377
 			if (!$j) {
378 378
 				return ['', ''];
@@ -384,7 +384,7 @@  discard block
 block discarded – undo
384 384
 					$l = (preg_split('/\s*,\s*/', $k));
385 385
 					$k = $desc['key']['PRIMARY KEY'];
386 386
 					if (!in_array($k, $l)) {
387
-						spip_logger()->info("jointure impossible $e " . implode(',', $l));
387
+						spip_logger()->info("jointure impossible $e ".implode(',', $l));
388 388
 
389 389
 						return ['', ''];
390 390
 					}
@@ -400,7 +400,7 @@  discard block
 block discarded – undo
400 400
 	// demander a SQL de gerer le synonyme
401 401
 	// ca permet que excep soit dynamique (Cedric, 2/3/06)
402 402
 	if ($excep != $nom_champ) {
403
-		$excep .= ' AS ' . $nom_champ;
403
+		$excep .= ' AS '.$nom_champ;
404 404
 	}
405 405
 
406 406
 	return ["$t.$excep", $nom_champ];
@@ -648,7 +648,7 @@  discard block
 block discarded – undo
648 648
 		implode(',', $collecte),
649 649
 		($collecte ? $param : substr($param, 1)), # virer la virgule
650 650
 		memoriser_contexte_compil($p),
651
-		($supp ? ', ' . implode(',', $supp) : (''))
651
+		($supp ? ', '.implode(',', $supp) : (''))
652 652
 	);
653 653
 
654 654
 	$p->interdire_scripts = false;
@@ -682,7 +682,7 @@  discard block
 block discarded – undo
682 682
  * @return array
683 683
  *     Liste des codes PHP d'éxecution des balises collectées
684 684
  **/
685
-function collecter_balise_dynamique(array $l, Champ &$p, string $nom): array {
685
+function collecter_balise_dynamique(array $l, Champ & $p, string $nom): array {
686 686
 	$args = [];
687 687
 	foreach ($l as $c) {
688 688
 		if ($c === null) {
@@ -747,7 +747,7 @@  discard block
 block discarded – undo
747 747
 	$nom = $p->id_boucle;
748 748
 
749 749
 	if ($nom && trouver_nom_serveur_distant($p)) {
750
-		spip_logger()->info($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
750
+		spip_logger()->info($nom.':'.$p->nom_champ.' '._T('zbug_distant_interdit'));
751 751
 
752 752
 		return false;
753 753
 	}
@@ -823,7 +823,7 @@  discard block
 block discarded – undo
823 823
 		&& $p->descr['documents']
824 824
 		&& (str_contains($ps, 'propre') || str_contains($ps, 'typo'))
825 825
 	) {
826
-		$ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
826
+		$ps = 'traiter_doublons_documents($doublons, '.$ps.')';
827 827
 	}
828 828
 
829 829
 	// La protection des champs par |safehtml est assuree par les extensions
@@ -926,7 +926,7 @@  discard block
 block discarded – undo
926 926
 function compose_filtres_args($p, $args, $sep) {
927 927
 	$arglist = '';
928 928
 	foreach ($args as $arg) {
929
-		$arglist .= $sep .
929
+		$arglist .= $sep.
930 930
 			calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
931 931
 	}
932 932
 
@@ -976,7 +976,7 @@  discard block
 block discarded – undo
976 976
 	while ($b != '') {
977 977
 		foreach ($p->boucles[$b]->criteres as $critere) {
978 978
 			if ($critere->op == $motif) {
979
-				$p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") .
979
+				$p->code = '$Pile[$SP'.(($n == 0) ? '' : "-$n").
980 980
 					"]['$champ']";
981 981
 				$b = '';
982 982
 				break 2;
@@ -1004,6 +1004,6 @@  discard block
 block discarded – undo
1004 1004
  */
1005 1005
 function zbug_presenter_champ($p, $champ = '') {
1006 1006
 	$balise = $champ ?: $p->nom_champ;
1007
-	$explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
1007
+	$explicite = $p->nom_boucle ? $p->nom_boucle.':' : '';
1008 1008
 	return "#{$explicite}{$balise}";
1009 1009
 }
Please login to merge, or discard this patch.
ecrire/public/normaliser.php 1 patch
Indentation   +50 added lines, -50 removed lines patch added patch discarded remove patch
@@ -13,15 +13,15 @@  discard block
 block discarded – undo
13 13
 \***************************************************************************/
14 14
 
15 15
 if (!defined('_ECRIRE_INC_VERSION')) {
16
-	return;
16
+    return;
17 17
 }
18 18
 
19 19
 function phraser_vieux_modele($p) {
20
- normaliser_args_inclumodel($p);
20
+    normaliser_args_inclumodel($p);
21 21
 }
22 22
 
23 23
 function phraser_vieux_inclu($p) {
24
- normaliser_args_inclumodel($p);
24
+    normaliser_args_inclumodel($p);
25 25
 }
26 26
 
27 27
 /**
@@ -32,24 +32,24 @@  discard block
 block discarded – undo
32 32
  * @return void
33 33
  */
34 34
 function normaliser_args_inclumodel($p) {
35
-	$params = $p->param;
36
-	if (!$params) {
37
-		return;
38
-	}
39
-	$args = $params[0];
40
-	if ($args[0]) {
41
-		return;
42
-	} // filtre immediat
43
-	array_shift($p->param);
44
-	foreach ($p->param as $l) {
45
-		if (!array_shift($l)) {
46
-			$args = array_merge($args, $l);
47
-			array_shift($p->param);
48
-		} else {
49
-			break;
50
-		} // filtre
51
-	}
52
-	array_unshift($p->param, $args);
35
+    $params = $p->param;
36
+    if (!$params) {
37
+        return;
38
+    }
39
+    $args = $params[0];
40
+    if ($args[0]) {
41
+        return;
42
+    } // filtre immediat
43
+    array_shift($p->param);
44
+    foreach ($p->param as $l) {
45
+        if (!array_shift($l)) {
46
+            $args = array_merge($args, $l);
47
+            array_shift($p->param);
48
+        } else {
49
+            break;
50
+        } // filtre
51
+    }
52
+    array_unshift($p->param, $args);
53 53
 }
54 54
 
55 55
 
@@ -59,35 +59,35 @@  discard block
 block discarded – undo
59 59
  * @return void
60 60
  */
61 61
 function normaliser_inclure($champ) {
62
-	normaliser_args_inclumodel($champ);
63
-	$l = $champ->param[0];
64
-	if (is_array($l) && !$l[0]) {
65
-		foreach ($l as $k => $p) {
66
-			if ($p && $p[0]->type == 'texte' && !strpos((string) $p[0]->texte, '=')) {
67
-				$p[0]->texte = trim((string) $p[0]->texte);
68
-			}
69
-		}
70
-		foreach ($l as $k => $p) {
71
-			if (
72
-				!$p || $p[0]->type != 'texte'
73
-				|| !preg_match('/^fond\s*=\s*(.*)$/', (string) $p[0]->texte, $r)
74
-			) {
75
-				continue;
76
-			}
62
+    normaliser_args_inclumodel($champ);
63
+    $l = $champ->param[0];
64
+    if (is_array($l) && !$l[0]) {
65
+        foreach ($l as $k => $p) {
66
+            if ($p && $p[0]->type == 'texte' && !strpos((string) $p[0]->texte, '=')) {
67
+                $p[0]->texte = trim((string) $p[0]->texte);
68
+            }
69
+        }
70
+        foreach ($l as $k => $p) {
71
+            if (
72
+                !$p || $p[0]->type != 'texte'
73
+                || !preg_match('/^fond\s*=\s*(.*)$/', (string) $p[0]->texte, $r)
74
+            ) {
75
+                continue;
76
+            }
77 77
 
78
-			if ($r[1]) {
79
-				$p[0]->texte = $r[1];
80
-			} else {
81
-				unset($p[0]);
82
-			}
83
-			$champ->texte = $p;
84
-			unset($champ->param[0][$k]);
85
-			if ((is_countable($champ->param[0]) ? count($champ->param[0]) : 0) == 1) {
86
-				array_shift($champ->param);
87
-			}
78
+            if ($r[1]) {
79
+                $p[0]->texte = $r[1];
80
+            } else {
81
+                unset($p[0]);
82
+            }
83
+            $champ->texte = $p;
84
+            unset($champ->param[0][$k]);
85
+            if ((is_countable($champ->param[0]) ? count($champ->param[0]) : 0) == 1) {
86
+                array_shift($champ->param);
87
+            }
88 88
 
89
-			return;
90
-		}
91
-	}
92
-	spip_logger('vieilles_def')->info('inclure sans fond ni fichier');
89
+            return;
90
+        }
91
+    }
92
+    spip_logger('vieilles_def')->info('inclure sans fond ni fichier');
93 93
 }
Please login to merge, or discard this patch.
ecrire/public/cacher.php 2 patches
Indentation   +276 added lines, -276 removed lines patch added patch discarded remove patch
@@ -14,7 +14,7 @@  discard block
 block discarded – undo
14 14
 use Spip\Component\Hasher\Hash32;
15 15
 
16 16
 if (!defined('_ECRIRE_INC_VERSION')) {
17
-	return;
17
+    return;
18 18
 }
19 19
 
20 20
 /**
@@ -23,24 +23,24 @@  discard block
 block discarded – undo
23 23
  * @internal Temporary fonction until DI in SPIP
24 24
  */
25 25
 function cache_instance(): CacheInterface {
26
-	static $cache = null;
27
-	return $cache ??= new LimitedFilesystem('calcul', _DIR_CACHE);
26
+    static $cache = null;
27
+    return $cache ??= new LimitedFilesystem('calcul', _DIR_CACHE);
28 28
 }
29 29
 
30 30
 /**
31 31
  * Returns a key cache (id) for this data
32 32
  */
33 33
 function cache_key(array $contexte, array $page): string {
34
-	static $hasher = null;
35
-	$hasher ??= new Hash32();
36
-	return $hasher->hash([$contexte, $page]) . '.cache';
34
+    static $hasher = null;
35
+    $hasher ??= new Hash32();
36
+    return $hasher->hash([$contexte, $page]) . '.cache';
37 37
 }
38 38
 
39 39
 /**
40 40
  * Écrire le cache dans un casier
41 41
  */
42 42
 function ecrire_cache(string $cache_key, array $valeur): bool {
43
-	return cache_instance()->set($cache_key, ['cache_key' => $cache_key, 'valeur' => $valeur]);
43
+    return cache_instance()->set($cache_key, ['cache_key' => $cache_key, 'valeur' => $valeur]);
44 44
 }
45 45
 
46 46
 /**
@@ -49,7 +49,7 @@  discard block
 block discarded – undo
49 49
  * @return null|mixed null: probably cache miss
50 50
  */
51 51
 function lire_cache(string $cache_key): mixed {
52
-	return cache_instance()->get($cache_key)['valeur'] ?? null;
52
+    return cache_instance()->get($cache_key)['valeur'] ?? null;
53 53
 }
54 54
 
55 55
 /**
@@ -58,16 +58,16 @@  discard block
 block discarded – undo
58 58
  * Parano : on signe le cache, afin d'interdire un hack d'injection dans notre memcache
59 59
  */
60 60
 function cache_signature(&$page): string {
61
-	if (!isset($GLOBALS['meta']['cache_signature'])) {
62
-		include_spip('inc/acces');
63
-		ecrire_meta(
64
-			'cache_signature',
65
-			hash('sha256', $_SERVER['DOCUMENT_ROOT'] . ($_SERVER['SERVER_SIGNATURE'] ?? '') . creer_uniqid()),
66
-			'non'
67
-		);
68
-	}
69
-
70
-	return (new Hash32())->hash($GLOBALS['meta']['cache_signature'] . $page['texte']);
61
+    if (!isset($GLOBALS['meta']['cache_signature'])) {
62
+        include_spip('inc/acces');
63
+        ecrire_meta(
64
+            'cache_signature',
65
+            hash('sha256', $_SERVER['DOCUMENT_ROOT'] . ($_SERVER['SERVER_SIGNATURE'] ?? '') . creer_uniqid()),
66
+            'non'
67
+        );
68
+    }
69
+
70
+    return (new Hash32())->hash($GLOBALS['meta']['cache_signature'] . $page['texte']);
71 71
 }
72 72
 
73 73
 /**
@@ -79,14 +79,14 @@  discard block
 block discarded – undo
79 79
  * on positionne un flag gz si on comprime, pour savoir si on doit decompresser ou pas
80 80
  */
81 81
 function gzip_page(array $page): array {
82
-	if (function_exists('gzcompress') && strlen((string) $page['texte']) > 16 * 1024) {
83
-		$page['gz'] = true;
84
-		$page['texte'] = gzcompress((string) $page['texte']);
85
-	} else {
86
-		$page['gz'] = false;
87
-	}
88
-
89
-	return $page;
82
+    if (function_exists('gzcompress') && strlen((string) $page['texte']) > 16 * 1024) {
83
+        $page['gz'] = true;
84
+        $page['texte'] = gzcompress((string) $page['texte']);
85
+    } else {
86
+        $page['gz'] = false;
87
+    }
88
+
89
+    return $page;
90 90
 }
91 91
 
92 92
 /**
@@ -97,10 +97,10 @@  discard block
 block discarded – undo
97 97
  * de decompresser deux fois de suite un cache (ce qui echoue)
98 98
  */
99 99
 function gunzip_page(array &$page): void {
100
-	if ($page['gz']) {
101
-		$page['texte'] = gzuncompress($page['texte']);
102
-		$page['gz'] = false; // ne pas gzuncompress deux fois une meme page
103
-	}
100
+    if ($page['gz']) {
101
+        $page['texte'] = gzuncompress($page['texte']);
102
+        $page['gz'] = false; // ne pas gzuncompress deux fois une meme page
103
+    }
104 104
 }
105 105
 
106 106
 /**
@@ -114,72 +114,72 @@  discard block
 block discarded – undo
114 114
  *  - -1 si il faut calculer sans stocker en cache
115 115
  */
116 116
 function cache_valide(array &$page, int $date): int {
117
-	$now = $_SERVER['REQUEST_TIME'];
118
-
119
-	// Apparition d'un nouvel article post-date ?
120
-	if (
121
-		isset($GLOBALS['meta']['post_dates'])
122
-		&& $GLOBALS['meta']['post_dates'] == 'non'
123
-		&& isset($GLOBALS['meta']['date_prochain_postdate'])
124
-		&& $now > $GLOBALS['meta']['date_prochain_postdate']
125
-	) {
126
-		spip_logger()->info('Un article post-date invalide le cache');
127
-		include_spip('inc/rubriques');
128
-		calculer_prochain_postdate(true);
129
-	}
130
-
131
-	if (defined('_VAR_NOCACHE') && _VAR_NOCACHE) {
132
-		return -1;
133
-	}
134
-	if (isset($GLOBALS['meta']['cache_inhib']) && $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
135
-		return -1;
136
-	}
137
-	if (defined('_NO_CACHE')) {
138
-		return (_NO_CACHE == 0 && !isset($page['texte'])) ? 1 : _NO_CACHE;
139
-	}
140
-
141
-	// pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)
142
-	if (!$page || !isset($page['texte']) || !isset($page['entetes']['X-Spip-Cache'])) {
143
-		return _IS_BOT ? -1 : 1;
144
-	}
145
-
146
-	// controle de la signature
147
-	if ($page['sig'] !== cache_signature($page)) {
148
-		return _IS_BOT ? -1 : 1;
149
-	}
150
-
151
-	// #CACHE{n,statique} => on n'invalide pas avec derniere_modif
152
-	// cf. ecrire/public/balises.php, balise_CACHE_dist()
153
-	// Cache invalide par la meta 'derniere_modif'
154
-	// sauf pour les bots, qui utilisent toujours le cache
155
-	if (
156
-		(!isset($page['entetes']['X-Spip-Statique']) || $page['entetes']['X-Spip-Statique'] !== 'oui')
157
-		&& (
158
-			!_IS_BOT
159
-			&& $GLOBALS['derniere_modif_invalide']
160
-			&& isset($GLOBALS['meta']['derniere_modif'])
161
-			&& $date < $GLOBALS['meta']['derniere_modif']
162
-		)
163
-	) {
164
-		return 1;
165
-	}
166
-
167
-	// Sinon comparer l'age du fichier a sa duree de cache
168
-	$duree = (int) $page['entetes']['X-Spip-Cache'];
169
-	$cache_mark = ($GLOBALS['meta']['cache_mark'] ?? 0);
170
-	if ($duree == 0) {  #CACHE{0}
171
-	return -1;
172
-	} // sauf pour les bots, qui utilisent toujours le cache
173
-	else {
174
-		if (
175
-			!_IS_BOT && $date + $duree < $now
176
-			|| $date < $cache_mark
177
-		) {
178
-			return _IS_BOT ? -1 : 1;
179
-		} else {
180
-			return 0;
181
-		}
182
-	}
117
+    $now = $_SERVER['REQUEST_TIME'];
118
+
119
+    // Apparition d'un nouvel article post-date ?
120
+    if (
121
+        isset($GLOBALS['meta']['post_dates'])
122
+        && $GLOBALS['meta']['post_dates'] == 'non'
123
+        && isset($GLOBALS['meta']['date_prochain_postdate'])
124
+        && $now > $GLOBALS['meta']['date_prochain_postdate']
125
+    ) {
126
+        spip_logger()->info('Un article post-date invalide le cache');
127
+        include_spip('inc/rubriques');
128
+        calculer_prochain_postdate(true);
129
+    }
130
+
131
+    if (defined('_VAR_NOCACHE') && _VAR_NOCACHE) {
132
+        return -1;
133
+    }
134
+    if (isset($GLOBALS['meta']['cache_inhib']) && $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
135
+        return -1;
136
+    }
137
+    if (defined('_NO_CACHE')) {
138
+        return (_NO_CACHE == 0 && !isset($page['texte'])) ? 1 : _NO_CACHE;
139
+    }
140
+
141
+    // pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)
142
+    if (!$page || !isset($page['texte']) || !isset($page['entetes']['X-Spip-Cache'])) {
143
+        return _IS_BOT ? -1 : 1;
144
+    }
145
+
146
+    // controle de la signature
147
+    if ($page['sig'] !== cache_signature($page)) {
148
+        return _IS_BOT ? -1 : 1;
149
+    }
150
+
151
+    // #CACHE{n,statique} => on n'invalide pas avec derniere_modif
152
+    // cf. ecrire/public/balises.php, balise_CACHE_dist()
153
+    // Cache invalide par la meta 'derniere_modif'
154
+    // sauf pour les bots, qui utilisent toujours le cache
155
+    if (
156
+        (!isset($page['entetes']['X-Spip-Statique']) || $page['entetes']['X-Spip-Statique'] !== 'oui')
157
+        && (
158
+            !_IS_BOT
159
+            && $GLOBALS['derniere_modif_invalide']
160
+            && isset($GLOBALS['meta']['derniere_modif'])
161
+            && $date < $GLOBALS['meta']['derniere_modif']
162
+        )
163
+    ) {
164
+        return 1;
165
+    }
166
+
167
+    // Sinon comparer l'age du fichier a sa duree de cache
168
+    $duree = (int) $page['entetes']['X-Spip-Cache'];
169
+    $cache_mark = ($GLOBALS['meta']['cache_mark'] ?? 0);
170
+    if ($duree == 0) {  #CACHE{0}
171
+    return -1;
172
+    } // sauf pour les bots, qui utilisent toujours le cache
173
+    else {
174
+        if (
175
+            !_IS_BOT && $date + $duree < $now
176
+            || $date < $cache_mark
177
+        ) {
178
+            return _IS_BOT ? -1 : 1;
179
+        } else {
180
+            return 0;
181
+        }
182
+    }
183 183
 }
184 184
 
185 185
 /**
@@ -193,58 +193,58 @@  discard block
 block discarded – undo
193 193
  */
194 194
 function creer_cache(&$page, &$cache_key) {
195 195
 
196
-	// Ne rien faire si on est en preview, debug, ou si une erreur
197
-	// grave s'est presentee (compilation du squelette, MySQL, etc)
198
-	// le cas var_nocache ne devrait jamais arriver ici (securite)
199
-	// le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
200
-	if (
201
-		defined('_VAR_NOCACHE') && _VAR_NOCACHE
202
-		|| defined('spip_interdire_cache')
203
-	) {
204
-		return;
205
-	}
206
-
207
-	// Si la page a un invalideur de session, utiliser un cache_key spécifique
208
-	if (
209
-		isset($page['invalideurs'])
210
-		&& isset($page['invalideurs']['session'])
211
-	) {
212
-		// on verifie que le contenu du chemin cache indique seulement
213
-		// "cache sessionne" ; sa date indique la date de validite
214
-		// des caches sessionnes
215
-		if (!$tmp = lire_cache($cache_key)) {
216
-			spip_logger()->info('Creation cache sessionne ' . $cache_key);
217
-			$tmp = [
218
-				'invalideurs' => ['session' => ''],
219
-				'lastmodified' => $_SERVER['REQUEST_TIME']
220
-			];
221
-			ecrire_cache($cache_key, $tmp);
222
-		}
223
-		$cache_key = cache_key(
224
-			['cache_key' => $cache_key],
225
-			['session' => $page['invalideurs']['session']]
226
-		);
227
-	}
228
-
229
-	// ajouter la date de production dans le cache lui meme
230
-	// (qui contient deja sa duree de validite)
231
-	$page['lastmodified'] = $_SERVER['REQUEST_TIME'];
232
-
233
-	// compresser le contenu si besoin
234
-	$pagez = gzip_page($page);
235
-
236
-	// signer le contenu
237
-	$pagez['sig'] = cache_signature($pagez);
238
-
239
-	// l'enregistrer, compresse ou non...
240
-	$ok = ecrire_cache($cache_key, $pagez);
241
-
242
-	spip_logger()->info((_IS_BOT ? 'Bot:' : '') . "Creation du cache $cache_key pour "
243
-		. $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'));
244
-
245
-	// Inserer ses invalideurs
246
-	include_spip('inc/invalideur');
247
-	maj_invalideurs($cache_key, $page);
196
+    // Ne rien faire si on est en preview, debug, ou si une erreur
197
+    // grave s'est presentee (compilation du squelette, MySQL, etc)
198
+    // le cas var_nocache ne devrait jamais arriver ici (securite)
199
+    // le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
200
+    if (
201
+        defined('_VAR_NOCACHE') && _VAR_NOCACHE
202
+        || defined('spip_interdire_cache')
203
+    ) {
204
+        return;
205
+    }
206
+
207
+    // Si la page a un invalideur de session, utiliser un cache_key spécifique
208
+    if (
209
+        isset($page['invalideurs'])
210
+        && isset($page['invalideurs']['session'])
211
+    ) {
212
+        // on verifie que le contenu du chemin cache indique seulement
213
+        // "cache sessionne" ; sa date indique la date de validite
214
+        // des caches sessionnes
215
+        if (!$tmp = lire_cache($cache_key)) {
216
+            spip_logger()->info('Creation cache sessionne ' . $cache_key);
217
+            $tmp = [
218
+                'invalideurs' => ['session' => ''],
219
+                'lastmodified' => $_SERVER['REQUEST_TIME']
220
+            ];
221
+            ecrire_cache($cache_key, $tmp);
222
+        }
223
+        $cache_key = cache_key(
224
+            ['cache_key' => $cache_key],
225
+            ['session' => $page['invalideurs']['session']]
226
+        );
227
+    }
228
+
229
+    // ajouter la date de production dans le cache lui meme
230
+    // (qui contient deja sa duree de validite)
231
+    $page['lastmodified'] = $_SERVER['REQUEST_TIME'];
232
+
233
+    // compresser le contenu si besoin
234
+    $pagez = gzip_page($page);
235
+
236
+    // signer le contenu
237
+    $pagez['sig'] = cache_signature($pagez);
238
+
239
+    // l'enregistrer, compresse ou non...
240
+    $ok = ecrire_cache($cache_key, $pagez);
241
+
242
+    spip_logger()->info((_IS_BOT ? 'Bot:' : '') . "Creation du cache $cache_key pour "
243
+        . $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'));
244
+
245
+    // Inserer ses invalideurs
246
+    include_spip('inc/invalideur');
247
+    maj_invalideurs($cache_key, $page);
248 248
 }
249 249
 
250 250
 /**
@@ -272,132 +272,132 @@  discard block
 block discarded – undo
272 272
  */
273 273
 function public_cacher_dist($contexte, &$use_cache, &$cache_key, &$page, &$lastmodified) {
274 274
 
275
-	# fonction de cache minimale : dire "non on ne met rien en cache"
276
-	# $use_cache = -1; return;
277
-
278
-	// Second appel, destine a l'enregistrement du cache sur le disque
279
-	if (isset($cache_key)) {
280
-		creer_cache($page, $cache_key);
281
-		return;
282
-	}
283
-
284
-	// Toute la suite correspond au premier appel
285
-	$contexte_implicite = $page['contexte_implicite'];
286
-
287
-	// Cas ignorant le cache car completement dynamique
288
-	if (
289
-		!empty($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST'
290
-		|| _request('connect')
291
-	) {
292
-		$use_cache = -1;
293
-		$lastmodified = 0;
294
-		$cache_key = '';
295
-		$page = [];
296
-
297
-		return;
298
-	}
299
-
300
-	// Controler l'existence d'un cache nous correspondant
301
-	$cache_key = cache_key($contexte, $page);
302
-	$lastmodified = 0;
303
-
304
-	// charger le cache s'il existe (et si il a bien le bon hash = anticollision)
305
-	if (!$page = lire_cache($cache_key)) {
306
-		$page = [];
307
-	}
308
-
309
-	// s'il est sessionne, charger celui correspondant a notre session
310
-	if (
311
-		isset($page['invalideurs'])
312
-		&& isset($page['invalideurs']['session'])
313
-	) {
314
-		$cache_key_session = cache_key(
315
-			['cache_key' => $cache_key],
316
-			['session' => spip_session()]
317
-		);
318
-		if (
319
-			($page_session = lire_cache($cache_key_session)) && $page_session['lastmodified'] >= $page['lastmodified']
320
-		) {
321
-			$page = $page_session;
322
-		} else {
323
-			$page = [];
324
-		}
325
-	}
326
-
327
-
328
-	// Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
329
-	// ne le faire que si la base est disponible
330
-	$invalider = false;
331
-	if (isset($GLOBALS['meta']['invalider']) && spip_connect()) {
332
-		$invalider = true;
333
-	}
334
-
335
-	// Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
336
-	// on supprime le cache
337
-	if (
338
-		defined('_VAR_MODE')
339
-		&& _VAR_MODE
340
-		&& (
341
-			isset($_COOKIE['spip_session'])
342
-			|| isset($_COOKIE['spip_admin'])
343
-			|| @file_exists(_ACCESS_FILE_NAME)
344
-		)
345
-	) {
346
-		$page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu
347
-		$invalider = true;
348
-	}
349
-	if ($invalider) {
350
-		include_spip('inc/invalideur');
351
-		retire_caches($cache_key); # API invalideur inutile
352
-		cache_instance()->delete($cache_key);
353
-		if (isset($cache_key_session) && $cache_key_session) {
354
-			cache_instance()->delete($cache_key_session);
355
-		}
356
-	}
357
-
358
-	// $delais par defaut
359
-	// pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
360
-	// qui sont a cache nul par defaut
361
-	if (!isset($GLOBALS['delais'])) {
362
-		if (!defined('_DUREE_CACHE_DEFAUT')) {
363
-			define('_DUREE_CACHE_DEFAUT', 24 * 3600);
364
-		}
365
-		$GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
366
-	}
367
-
368
-	// determiner la validite de la page
369
-	if ($page) {
370
-		$use_cache = cache_valide($page, $page['lastmodified'] ?? 0);
371
-		// le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
372
-		// par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
373
-		$page['contexte_implicite'] = $contexte_implicite;
374
-		if (!$use_cache) {
375
-			// $page est un cache utilisable
376
-			gunzip_page($page);
377
-
378
-			return;
379
-		}
380
-	} else {
381
-		$page = ['contexte_implicite' => $contexte_implicite];
382
-		$use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul
383
-	}
384
-
385
-	// Si pas valide mais pas de connexion a la base, le garder quand meme
386
-	if (!spip_connect()) {
387
-		if (isset($page['texte'])) {
388
-			gunzip_page($page);
389
-			$use_cache = 0;
390
-		} else {
391
-			spip_logger()->info("Erreur base de donnees, impossible utiliser $cache_key");
392
-			include_spip('inc/minipres');
393
-
394
-			return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
395
-		}
396
-	}
397
-
398
-	if ($use_cache < 0) {
399
-		$cache_key = '';
400
-	}
401
-
402
-	return;
275
+    # fonction de cache minimale : dire "non on ne met rien en cache"
276
+    # $use_cache = -1; return;
277
+
278
+    // Second appel, destine a l'enregistrement du cache sur le disque
279
+    if (isset($cache_key)) {
280
+        creer_cache($page, $cache_key);
281
+        return;
282
+    }
283
+
284
+    // Toute la suite correspond au premier appel
285
+    $contexte_implicite = $page['contexte_implicite'];
286
+
287
+    // Cas ignorant le cache car completement dynamique
288
+    if (
289
+        !empty($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST'
290
+        || _request('connect')
291
+    ) {
292
+        $use_cache = -1;
293
+        $lastmodified = 0;
294
+        $cache_key = '';
295
+        $page = [];
296
+
297
+        return;
298
+    }
299
+
300
+    // Controler l'existence d'un cache nous correspondant
301
+    $cache_key = cache_key($contexte, $page);
302
+    $lastmodified = 0;
303
+
304
+    // charger le cache s'il existe (et si il a bien le bon hash = anticollision)
305
+    if (!$page = lire_cache($cache_key)) {
306
+        $page = [];
307
+    }
308
+
309
+    // s'il est sessionne, charger celui correspondant a notre session
310
+    if (
311
+        isset($page['invalideurs'])
312
+        && isset($page['invalideurs']['session'])
313
+    ) {
314
+        $cache_key_session = cache_key(
315
+            ['cache_key' => $cache_key],
316
+            ['session' => spip_session()]
317
+        );
318
+        if (
319
+            ($page_session = lire_cache($cache_key_session)) && $page_session['lastmodified'] >= $page['lastmodified']
320
+        ) {
321
+            $page = $page_session;
322
+        } else {
323
+            $page = [];
324
+        }
325
+    }
326
+
327
+
328
+    // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
329
+    // ne le faire que si la base est disponible
330
+    $invalider = false;
331
+    if (isset($GLOBALS['meta']['invalider']) && spip_connect()) {
332
+        $invalider = true;
333
+    }
334
+
335
+    // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
336
+    // on supprime le cache
337
+    if (
338
+        defined('_VAR_MODE')
339
+        && _VAR_MODE
340
+        && (
341
+            isset($_COOKIE['spip_session'])
342
+            || isset($_COOKIE['spip_admin'])
343
+            || @file_exists(_ACCESS_FILE_NAME)
344
+        )
345
+    ) {
346
+        $page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu
347
+        $invalider = true;
348
+    }
349
+    if ($invalider) {
350
+        include_spip('inc/invalideur');
351
+        retire_caches($cache_key); # API invalideur inutile
352
+        cache_instance()->delete($cache_key);
353
+        if (isset($cache_key_session) && $cache_key_session) {
354
+            cache_instance()->delete($cache_key_session);
355
+        }
356
+    }
357
+
358
+    // $delais par defaut
359
+    // pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
360
+    // qui sont a cache nul par defaut
361
+    if (!isset($GLOBALS['delais'])) {
362
+        if (!defined('_DUREE_CACHE_DEFAUT')) {
363
+            define('_DUREE_CACHE_DEFAUT', 24 * 3600);
364
+        }
365
+        $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
366
+    }
367
+
368
+    // determiner la validite de la page
369
+    if ($page) {
370
+        $use_cache = cache_valide($page, $page['lastmodified'] ?? 0);
371
+        // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
372
+        // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
373
+        $page['contexte_implicite'] = $contexte_implicite;
374
+        if (!$use_cache) {
375
+            // $page est un cache utilisable
376
+            gunzip_page($page);
377
+
378
+            return;
379
+        }
380
+    } else {
381
+        $page = ['contexte_implicite' => $contexte_implicite];
382
+        $use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul
383
+    }
384
+
385
+    // Si pas valide mais pas de connexion a la base, le garder quand meme
386
+    if (!spip_connect()) {
387
+        if (isset($page['texte'])) {
388
+            gunzip_page($page);
389
+            $use_cache = 0;
390
+        } else {
391
+            spip_logger()->info("Erreur base de donnees, impossible utiliser $cache_key");
392
+            include_spip('inc/minipres');
393
+
394
+            return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
395
+        }
396
+    }
397
+
398
+    if ($use_cache < 0) {
399
+        $cache_key = '';
400
+    }
401
+
402
+    return;
403 403
 }
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -33,7 +33,7 @@  discard block
 block discarded – undo
33 33
 function cache_key(array $contexte, array $page): string {
34 34
 	static $hasher = null;
35 35
 	$hasher ??= new Hash32();
36
-	return $hasher->hash([$contexte, $page]) . '.cache';
36
+	return $hasher->hash([$contexte, $page]).'.cache';
37 37
 }
38 38
 
39 39
 /**
@@ -62,12 +62,12 @@  discard block
 block discarded – undo
62 62
 		include_spip('inc/acces');
63 63
 		ecrire_meta(
64 64
 			'cache_signature',
65
-			hash('sha256', $_SERVER['DOCUMENT_ROOT'] . ($_SERVER['SERVER_SIGNATURE'] ?? '') . creer_uniqid()),
65
+			hash('sha256', $_SERVER['DOCUMENT_ROOT'].($_SERVER['SERVER_SIGNATURE'] ?? '').creer_uniqid()),
66 66
 			'non'
67 67
 		);
68 68
 	}
69 69
 
70
-	return (new Hash32())->hash($GLOBALS['meta']['cache_signature'] . $page['texte']);
70
+	return (new Hash32())->hash($GLOBALS['meta']['cache_signature'].$page['texte']);
71 71
 }
72 72
 
73 73
 /**
@@ -213,7 +213,7 @@  discard block
 block discarded – undo
213 213
 		// "cache sessionne" ; sa date indique la date de validite
214 214
 		// des caches sessionnes
215 215
 		if (!$tmp = lire_cache($cache_key)) {
216
-			spip_logger()->info('Creation cache sessionne ' . $cache_key);
216
+			spip_logger()->info('Creation cache sessionne '.$cache_key);
217 217
 			$tmp = [
218 218
 				'invalideurs' => ['session' => ''],
219 219
 				'lastmodified' => $_SERVER['REQUEST_TIME']
@@ -239,8 +239,8 @@  discard block
 block discarded – undo
239 239
 	// l'enregistrer, compresse ou non...
240 240
 	$ok = ecrire_cache($cache_key, $pagez);
241 241
 
242
-	spip_logger()->info((_IS_BOT ? 'Bot:' : '') . "Creation du cache $cache_key pour "
243
-		. $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'));
242
+	spip_logger()->info((_IS_BOT ? 'Bot:' : '')."Creation du cache $cache_key pour "
243
+		. $page['entetes']['X-Spip-Cache'].' secondes'.($ok ? '' : ' (erreur!)'));
244 244
 
245 245
 	// Inserer ses invalideurs
246 246
 	include_spip('inc/invalideur');
Please login to merge, or discard this patch.
ecrire/public/debusquer.php 2 patches
Indentation   +691 added lines, -691 removed lines patch added patch discarded remove patch
@@ -12,7 +12,7 @@  discard block
 block discarded – undo
12 12
 \***************************************************************************/
13 13
 
14 14
 if (!defined('_ECRIRE_INC_VERSION')) {
15
-	return;
15
+    return;
16 16
 }
17 17
 
18 18
 include_spip('public/decompiler');
@@ -69,125 +69,125 @@  discard block
 block discarded – undo
69 69
  *     - true si $opt 'erreurs' = 'reset'
70 70
  **/
71 71
 function public_debusquer_dist($message = '', $lieu = '', $opt = []) {
72
-	static $should_log;
73
-	static $tableau_des_erreurs = [];
74
-
75
-	// Pour des tests unitaires, pouvoir récupérer les erreurs générées
76
-	if (isset($opt['erreurs'])) {
77
-		if ($opt['erreurs'] == 'get') {
78
-			return $tableau_des_erreurs;
79
-		}
80
-		if ($opt['erreurs'] == 'reset') {
81
-			$tableau_des_erreurs = [];
82
-
83
-			return true;
84
-		}
85
-	}
86
-
87
-	if (is_null($should_log)) {
88
-		$should_log = (empty($GLOBALS['visiteur_session']) || !include_spip('inc/autoriser') || !autoriser('debug'));
89
-	}
90
-
91
-	// Erreur ou appel final ?
92
-	if ($message) {
93
-		$message = debusquer_compose_message($message);
94
-		$tableau_des_erreurs[] = [$message, $lieu];
95
-		set_request('var_mode', 'debug');
96
-		$GLOBALS['bouton_admin_debug'] = true;
97
-		// Permettre a la compil de continuer
98
-		if (is_object($lieu) && (!isset($lieu->code) || !$lieu->code)) {
99
-			$lieu->code = "''";
100
-		}
101
-		// loger si personne ne verra l'erreur
102
-		if ($should_log) {
103
-			debusquer_loger_erreur($message, $lieu);
104
-		}
105
-		// forcer l'appel au debusqueur en cas de boucles infernales
106
-		$urgence = (_DEBUG_MAX_SQUELETTE_ERREURS && (is_countable($tableau_des_erreurs) ? count($tableau_des_erreurs) : 0) > _DEBUG_MAX_SQUELETTE_ERREURS);
107
-		if (!$urgence) {
108
-			return;
109
-		}
110
-	}
111
-	// espace public ?
112
-	if (empty($GLOBALS['debug_objets']['principal']) && isset($GLOBALS['fond'])) {
113
-		$GLOBALS['debug_objets']['principal'] = $GLOBALS['fond'];
114
-	}
115
-
116
-	include_spip('inc/autoriser');
117
-	if (!autoriser('debug')) {
118
-		return;
119
-	}
120
-	include_spip('inc/headers');
121
-	include_spip('inc/filtres');
122
-
123
-	lang_select($GLOBALS['visiteur_session']['lang'] ?? null);
124
-	$fonc = preg_replace(',\W,', '_', _request('var_mode_objet') ?? '');
125
-	$mode = preg_replace(',\W,', '_', _request('var_mode_affiche') ?? '');
126
-
127
-	$self = str_replace("\\'", '&#39;', (string) self());
128
-	$self = parametre_url($self, 'var_mode', 'debug');
129
-
130
-	$res = debusquer_bandeau($tableau_des_erreurs)
131
-		. '<br />'
132
-		. debusquer_squelette($fonc, $mode, $self);
133
-
134
-	if (!_DIR_RESTREINT || headers_sent()) {
135
-		return $res;
136
-	}
137
-	if ($tableau_des_erreurs) {
138
-		http_response_code(503);
139
-	}
140
-
141
-	http_no_cache();
142
-	if (isset($_GET['var_profile'])) {
143
-		$titre = parametre_url($GLOBALS['REQUEST_URI'], 'var_profile', '');
144
-		$titre = parametre_url($titre, 'var_mode', '');
145
-	} else {
146
-		if (!$fonc) {
147
-			$fonc = $GLOBALS['debug_objets']['principal'];
148
-		}
149
-		$titre = $mode ? $mode . (isset($GLOBALS['debug_objets']['sourcefile'][$fonc]) ? ' ' . $GLOBALS['debug_objets']['sourcefile'][$fonc] : '') : ($fonc);
150
-	}
151
-	if ($message === false) {
152
-		lang_select();
153
-
154
-		return debusquer_entete($titre, $res);
155
-	} else {
156
-		echo debusquer_entete($titre, $res);
157
-	}
158
-	exit;
72
+    static $should_log;
73
+    static $tableau_des_erreurs = [];
74
+
75
+    // Pour des tests unitaires, pouvoir récupérer les erreurs générées
76
+    if (isset($opt['erreurs'])) {
77
+        if ($opt['erreurs'] == 'get') {
78
+            return $tableau_des_erreurs;
79
+        }
80
+        if ($opt['erreurs'] == 'reset') {
81
+            $tableau_des_erreurs = [];
82
+
83
+            return true;
84
+        }
85
+    }
86
+
87
+    if (is_null($should_log)) {
88
+        $should_log = (empty($GLOBALS['visiteur_session']) || !include_spip('inc/autoriser') || !autoriser('debug'));
89
+    }
90
+
91
+    // Erreur ou appel final ?
92
+    if ($message) {
93
+        $message = debusquer_compose_message($message);
94
+        $tableau_des_erreurs[] = [$message, $lieu];
95
+        set_request('var_mode', 'debug');
96
+        $GLOBALS['bouton_admin_debug'] = true;
97
+        // Permettre a la compil de continuer
98
+        if (is_object($lieu) && (!isset($lieu->code) || !$lieu->code)) {
99
+            $lieu->code = "''";
100
+        }
101
+        // loger si personne ne verra l'erreur
102
+        if ($should_log) {
103
+            debusquer_loger_erreur($message, $lieu);
104
+        }
105
+        // forcer l'appel au debusqueur en cas de boucles infernales
106
+        $urgence = (_DEBUG_MAX_SQUELETTE_ERREURS && (is_countable($tableau_des_erreurs) ? count($tableau_des_erreurs) : 0) > _DEBUG_MAX_SQUELETTE_ERREURS);
107
+        if (!$urgence) {
108
+            return;
109
+        }
110
+    }
111
+    // espace public ?
112
+    if (empty($GLOBALS['debug_objets']['principal']) && isset($GLOBALS['fond'])) {
113
+        $GLOBALS['debug_objets']['principal'] = $GLOBALS['fond'];
114
+    }
115
+
116
+    include_spip('inc/autoriser');
117
+    if (!autoriser('debug')) {
118
+        return;
119
+    }
120
+    include_spip('inc/headers');
121
+    include_spip('inc/filtres');
122
+
123
+    lang_select($GLOBALS['visiteur_session']['lang'] ?? null);
124
+    $fonc = preg_replace(',\W,', '_', _request('var_mode_objet') ?? '');
125
+    $mode = preg_replace(',\W,', '_', _request('var_mode_affiche') ?? '');
126
+
127
+    $self = str_replace("\\'", '&#39;', (string) self());
128
+    $self = parametre_url($self, 'var_mode', 'debug');
129
+
130
+    $res = debusquer_bandeau($tableau_des_erreurs)
131
+        . '<br />'
132
+        . debusquer_squelette($fonc, $mode, $self);
133
+
134
+    if (!_DIR_RESTREINT || headers_sent()) {
135
+        return $res;
136
+    }
137
+    if ($tableau_des_erreurs) {
138
+        http_response_code(503);
139
+    }
140
+
141
+    http_no_cache();
142
+    if (isset($_GET['var_profile'])) {
143
+        $titre = parametre_url($GLOBALS['REQUEST_URI'], 'var_profile', '');
144
+        $titre = parametre_url($titre, 'var_mode', '');
145
+    } else {
146
+        if (!$fonc) {
147
+            $fonc = $GLOBALS['debug_objets']['principal'];
148
+        }
149
+        $titre = $mode ? $mode . (isset($GLOBALS['debug_objets']['sourcefile'][$fonc]) ? ' ' . $GLOBALS['debug_objets']['sourcefile'][$fonc] : '') : ($fonc);
150
+    }
151
+    if ($message === false) {
152
+        lang_select();
153
+
154
+        return debusquer_entete($titre, $res);
155
+    } else {
156
+        echo debusquer_entete($titre, $res);
157
+    }
158
+    exit;
159 159
 }
160 160
 
161 161
 function debusquer_compose_message($msg) {
162
-	if (is_array($msg)) {
163
-		// si c'est un texte, c'est une traduction a faire, mais
164
-		// sqlite renvoit aussi des erreurs alpha num (mais avec 3 arguments)
165
-		$msg = !is_numeric($msg[0]) && count($msg) == 2 ? _T($msg[0], $msg[1], 'spip-debug-arg') : debusquer_requete($msg);
166
-	}
167
-	// FIXME: le fond n'est pas la si on n'est pas dans un squelette
168
-	// cela dit, ca serait bien d'indiquer tout de meme d'ou vient l'erreur
169
-	$fond = $GLOBALS['fond'] ?? '';
170
-	// une erreur critique sort $message en array
171
-	$debug = is_array($msg) ? $msg[1] : $msg;
172
-	spip_logger()->info('Debug: ' . $debug . ' (' . $fond . ')');
173
-
174
-	return $msg;
162
+    if (is_array($msg)) {
163
+        // si c'est un texte, c'est une traduction a faire, mais
164
+        // sqlite renvoit aussi des erreurs alpha num (mais avec 3 arguments)
165
+        $msg = !is_numeric($msg[0]) && count($msg) == 2 ? _T($msg[0], $msg[1], 'spip-debug-arg') : debusquer_requete($msg);
166
+    }
167
+    // FIXME: le fond n'est pas la si on n'est pas dans un squelette
168
+    // cela dit, ca serait bien d'indiquer tout de meme d'ou vient l'erreur
169
+    $fond = $GLOBALS['fond'] ?? '';
170
+    // une erreur critique sort $message en array
171
+    $debug = is_array($msg) ? $msg[1] : $msg;
172
+    spip_logger()->info('Debug: ' . $debug . ' (' . $fond . ')');
173
+
174
+    return $msg;
175 175
 }
176 176
 
177 177
 function debusquer_bandeau($erreurs) {
178 178
 
179
-	if (!empty($erreurs)) {
180
-		$n = [(is_countable($erreurs) ? count($erreurs) : 0) . ' ' . _T('zbug_erreur_squelette')];
179
+    if (!empty($erreurs)) {
180
+        $n = [(is_countable($erreurs) ? count($erreurs) : 0) . ' ' . _T('zbug_erreur_squelette')];
181 181
 
182
-		return debusquer_navigation($erreurs, $n);
183
-	} elseif (!empty($GLOBALS['tableau_des_temps'])) {
184
-		include_spip('public/tracer');
185
-		[$temps, $nav] = chrono_requete($GLOBALS['tableau_des_temps']);
182
+        return debusquer_navigation($erreurs, $n);
183
+    } elseif (!empty($GLOBALS['tableau_des_temps'])) {
184
+        include_spip('public/tracer');
185
+        [$temps, $nav] = chrono_requete($GLOBALS['tableau_des_temps']);
186 186
 
187
-		return debusquer_navigation($temps, $nav, 'debug-profile');
188
-	} else {
189
-		return '';
190
-	}
187
+        return debusquer_navigation($temps, $nav, 'debug-profile');
188
+    } else {
189
+        return '';
190
+    }
191 191
 }
192 192
 
193 193
 /**
@@ -197,63 +197,63 @@  discard block
 block discarded – undo
197 197
  * @return string Code HTML
198 198
  **/
199 199
 function debusquer_contexte($env) {
200
-	if (is_string($env) && is_array($env_tab = @unserialize($env))) {
201
-		$env = $env_tab;
202
-	}
203
-
204
-	if (!$env) {
205
-		return '';
206
-	}
207
-	$res = '';
208
-	foreach ($env as $nom => $valeur) {
209
-		if (is_array($valeur)) {
210
-			$valeur_simple = [];
211
-			foreach ($valeur as $v) {
212
-				if (is_array($v)) {
213
-					$valeur_simple[] = 'array:' . count($v);
214
-				} elseif (is_object($v)) {
215
-					$valeur_simple[] = $v::class;
216
-				} elseif (is_string($v)) {
217
-					$valeur_simple[] = "'" . $v . "'";
218
-				} else {
219
-					$valeur_simple[] = $v;
220
-				}
221
-			}
222
-			$n = count($valeur);
223
-			$valeur = (($n > 3) ? 'array:' . $n . ' ' : '');
224
-			$valeur .= '[' . implode(', ', $valeur_simple) . ']';
225
-		} elseif (is_object($valeur)) {
226
-			$valeur = $valeur::class;
227
-		} elseif (is_string($valeur)) {
228
-			$valeur = "'" . $valeur . "'";
229
-		}
230
-		$res .= "\n<tr><td><strong>" . nl2br((string) entites_html($nom))
231
-			. '</strong></td><td>:&nbsp;' . nl2br((string) entites_html($valeur))
232
-			. "</td></tr>\n";
233
-	}
234
-
235
-	return "<div class='spip-env'><fieldset><legend onclick=\"this.parentElement.classList.toggle('expanded');\">#ENV</legend>\n<div><table>$res</table></div></fieldset></div>\n";
200
+    if (is_string($env) && is_array($env_tab = @unserialize($env))) {
201
+        $env = $env_tab;
202
+    }
203
+
204
+    if (!$env) {
205
+        return '';
206
+    }
207
+    $res = '';
208
+    foreach ($env as $nom => $valeur) {
209
+        if (is_array($valeur)) {
210
+            $valeur_simple = [];
211
+            foreach ($valeur as $v) {
212
+                if (is_array($v)) {
213
+                    $valeur_simple[] = 'array:' . count($v);
214
+                } elseif (is_object($v)) {
215
+                    $valeur_simple[] = $v::class;
216
+                } elseif (is_string($v)) {
217
+                    $valeur_simple[] = "'" . $v . "'";
218
+                } else {
219
+                    $valeur_simple[] = $v;
220
+                }
221
+            }
222
+            $n = count($valeur);
223
+            $valeur = (($n > 3) ? 'array:' . $n . ' ' : '');
224
+            $valeur .= '[' . implode(', ', $valeur_simple) . ']';
225
+        } elseif (is_object($valeur)) {
226
+            $valeur = $valeur::class;
227
+        } elseif (is_string($valeur)) {
228
+            $valeur = "'" . $valeur . "'";
229
+        }
230
+        $res .= "\n<tr><td><strong>" . nl2br((string) entites_html($nom))
231
+            . '</strong></td><td>:&nbsp;' . nl2br((string) entites_html($valeur))
232
+            . "</td></tr>\n";
233
+    }
234
+
235
+    return "<div class='spip-env'><fieldset><legend onclick=\"this.parentElement.classList.toggle('expanded');\">#ENV</legend>\n<div><table>$res</table></div></fieldset></div>\n";
236 236
 }
237 237
 
238 238
 
239 239
 function debusquer_loger_erreur($msg, $lieu) {
240
-	$boucle = $ligne = $skel = '';
241
-	if (is_object($lieu)) {
242
-		$ligne = ($lieu->ligne ?? '');
243
-		$boucle = ($lieu->id_boucle ?? '');
244
-		$skel = ($lieu->descr['sourcefile'] ?? '');
245
-	}
246
-	$msg = (is_array($msg) ? implode('', $msg) : $msg);
247
-	if ($skel) {
248
-		$msg .= " Squelette $skel";
249
-	}
250
-	if ($boucle) {
251
-		$msg .= " Boucle $boucle";
252
-	}
253
-	if ($ligne) {
254
-		$msg .= " L$ligne";
255
-	}
256
-	spip_logger('debusquer')->error($msg);
240
+    $boucle = $ligne = $skel = '';
241
+    if (is_object($lieu)) {
242
+        $ligne = ($lieu->ligne ?? '');
243
+        $boucle = ($lieu->id_boucle ?? '');
244
+        $skel = ($lieu->descr['sourcefile'] ?? '');
245
+    }
246
+    $msg = (is_array($msg) ? implode('', $msg) : $msg);
247
+    if ($skel) {
248
+        $msg .= " Squelette $skel";
249
+    }
250
+    if ($boucle) {
251
+        $msg .= " Boucle $boucle";
252
+    }
253
+    if ($ligne) {
254
+        $msg .= " L$ligne";
255
+    }
256
+    spip_logger('debusquer')->error($msg);
257 257
 }
258 258
 
259 259
 
@@ -262,66 +262,66 @@  discard block
 block discarded – undo
262 262
 
263 263
 function debusquer_navigation($tableau, $caption = [], $id = 'debug-nav') {
264 264
 
265
-	if (_request('exec') == 'valider_xml') {
266
-		return '';
267
-	}
268
-	$GLOBALS['bouton_admin_debug'] = true;
269
-	$res = '';
270
-	$href = quote_amp(parametre_url($GLOBALS['REQUEST_URI'], 'var_mode', 'debug'));
271
-	foreach ($tableau as $i => $err) {
272
-		$boucle = $ligne = $skel = '';
273
-		[$msg, $lieu] = $err;
274
-		if (is_object($lieu)) {
275
-			$ligne = $lieu->ligne;
276
-			$boucle = empty($lieu->id_boucle) ? '' : $lieu->id_boucle;
277
-			if (isset($lieu->descr['nom'])) {
278
-				$nom_code = $lieu->descr['nom'];
279
-				$skel = $lieu->descr['sourcefile'];
280
-				$h2 = parametre_url($href, 'var_mode_objet', $nom_code);
281
-				$h3 = parametre_url($h2, 'var_mode_affiche', 'squelette') . '#L' . $ligne;
282
-				$skel = "<a href='$h3'><b>$skel</b></a>";
283
-				if ($boucle) {
284
-					$h3 = parametre_url($h2 . $boucle, 'var_mode_affiche', 'boucle');
285
-					$boucle = "<a href='$h3'><b>$boucle</b></a>";
286
-				}
287
-			}
288
-		}
289
-
290
-		$j = ($i + 1);
291
-		$res .= "<tr id='req$j'><td style='text-align: right'>"
292
-			. $j
293
-			. "&nbsp;</td><td style='text-align: left'>"
294
-			. (is_array($msg) ? implode('', $msg) : $msg)
295
-			. "</td><td style='text-align: left'>"
296
-			. ($skel ?: '&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;')
297
-			. "</td><td class='spip-debug-arg' style='text-align: left'>"
298
-			. ($boucle ?: '&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;')
299
-			. "</td><td style='text-align: right'>"
300
-			. $ligne
301
-			. "</td></tr>\n";
302
-	}
303
-
304
-	return "\n<table id='$id'>"
305
-	. "<caption onclick=\"x = document.getElementById('$id'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\">"
306
-	. $caption[0]
265
+    if (_request('exec') == 'valider_xml') {
266
+        return '';
267
+    }
268
+    $GLOBALS['bouton_admin_debug'] = true;
269
+    $res = '';
270
+    $href = quote_amp(parametre_url($GLOBALS['REQUEST_URI'], 'var_mode', 'debug'));
271
+    foreach ($tableau as $i => $err) {
272
+        $boucle = $ligne = $skel = '';
273
+        [$msg, $lieu] = $err;
274
+        if (is_object($lieu)) {
275
+            $ligne = $lieu->ligne;
276
+            $boucle = empty($lieu->id_boucle) ? '' : $lieu->id_boucle;
277
+            if (isset($lieu->descr['nom'])) {
278
+                $nom_code = $lieu->descr['nom'];
279
+                $skel = $lieu->descr['sourcefile'];
280
+                $h2 = parametre_url($href, 'var_mode_objet', $nom_code);
281
+                $h3 = parametre_url($h2, 'var_mode_affiche', 'squelette') . '#L' . $ligne;
282
+                $skel = "<a href='$h3'><b>$skel</b></a>";
283
+                if ($boucle) {
284
+                    $h3 = parametre_url($h2 . $boucle, 'var_mode_affiche', 'boucle');
285
+                    $boucle = "<a href='$h3'><b>$boucle</b></a>";
286
+                }
287
+            }
288
+        }
289
+
290
+        $j = ($i + 1);
291
+        $res .= "<tr id='req$j'><td style='text-align: right'>"
292
+            . $j
293
+            . "&nbsp;</td><td style='text-align: left'>"
294
+            . (is_array($msg) ? implode('', $msg) : $msg)
295
+            . "</td><td style='text-align: left'>"
296
+            . ($skel ?: '&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;')
297
+            . "</td><td class='spip-debug-arg' style='text-align: left'>"
298
+            . ($boucle ?: '&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;')
299
+            . "</td><td style='text-align: right'>"
300
+            . $ligne
301
+            . "</td></tr>\n";
302
+    }
303
+
304
+    return "\n<table id='$id'>"
305
+    . "<caption onclick=\"x = document.getElementById('$id'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\">"
306
+    . $caption[0]
307 307
 ## aide locale courte a ecrire, avec lien vers une grosse page de documentation
308 308
 #		aider('erreur_compilation'),
309
-	. '</caption>'
310
-	//  fausse caption du chrono (mais vraie nav)
311
-	. (empty($caption[1]) ? '' : $caption[1])
312
-	. '<tr><th>'
313
-	. _T('numero')
314
-	. '</th><th>'
315
-	. _T('public:message')
316
-	. '</th><th>'
317
-	. _T('squelette')
318
-	. '</th><th>'
319
-	. _T('zbug_boucle')
320
-	. '</th><th>'
321
-	. _T('ligne')
322
-	. '</th></tr>'
323
-	. $res
324
-	. '</table>';
309
+    . '</caption>'
310
+    //  fausse caption du chrono (mais vraie nav)
311
+    . (empty($caption[1]) ? '' : $caption[1])
312
+    . '<tr><th>'
313
+    . _T('numero')
314
+    . '</th><th>'
315
+    . _T('public:message')
316
+    . '</th><th>'
317
+    . _T('squelette')
318
+    . '</th><th>'
319
+    . _T('zbug_boucle')
320
+    . '</th><th>'
321
+    . _T('ligne')
322
+    . '</th></tr>'
323
+    . $res
324
+    . '</table>';
325 325
 }
326 326
 
327 327
 
@@ -341,518 +341,518 @@  discard block
 block discarded – undo
341 341
  *    ou un tableau si l'erreur est critique
342 342
  **/
343 343
 function debusquer_requete($message) {
344
-	[$errno, $msg, $query] = $message;
345
-
346
-	// FIXME: ces écritures mélangent divers syntaxe des moteurs SQL
347
-	// il serait plus prudent certainement d'avoir une fonction d'analyse par moteur
348
-	if (preg_match(',err(no|code):?[[:space:]]*(\d+),i', (string) $msg, $regs)) {
349
-		$errno = $regs[2];
350
-	} elseif (
351
-		is_numeric($errno) && ($errno == 1030 || $errno <= 1026)
352
-		&& preg_match(',[^[:alnum:]](\d+)[^[:alnum:]],', (string) $msg, $regs)
353
-	) {
354
-		$errno = $regs[1];
355
-	}
356
-
357
-	// Erreur systeme
358
-	if (is_numeric($errno) && $errno > 0 && $errno < 200) {
359
-		$retour = '<tt><br /><br /><blink>'
360
-			. _T('info_erreur_systeme', ['errsys' => $errno])
361
-			. "</blink><br />\n<b>"
362
-			. _T(
363
-				'info_erreur_systeme2',
364
-				['script' => generer_url_ecrire('base_repair')]
365
-			)
366
-			. '</b><br />';
367
-			spip_logger()->info("Erreur systeme $errno");
368
-
369
-		return [$retour, ''];
370
-	}
371
-
372
-	// Requete erronee
373
-	$err = '<b>' . _T('avis_erreur_mysql') . " $errno</b><br /><tt>\n"
374
-		. spip_htmlspecialchars($msg)
375
-		. "\n<br /><span style='color: red'><b>"
376
-		. spip_htmlspecialchars($query)
377
-		. '</b></span></tt><br />';
378
-
379
-	//. aider('erreur_mysql');
380
-
381
-	return $err;
344
+    [$errno, $msg, $query] = $message;
345
+
346
+    // FIXME: ces écritures mélangent divers syntaxe des moteurs SQL
347
+    // il serait plus prudent certainement d'avoir une fonction d'analyse par moteur
348
+    if (preg_match(',err(no|code):?[[:space:]]*(\d+),i', (string) $msg, $regs)) {
349
+        $errno = $regs[2];
350
+    } elseif (
351
+        is_numeric($errno) && ($errno == 1030 || $errno <= 1026)
352
+        && preg_match(',[^[:alnum:]](\d+)[^[:alnum:]],', (string) $msg, $regs)
353
+    ) {
354
+        $errno = $regs[1];
355
+    }
356
+
357
+    // Erreur systeme
358
+    if (is_numeric($errno) && $errno > 0 && $errno < 200) {
359
+        $retour = '<tt><br /><br /><blink>'
360
+            . _T('info_erreur_systeme', ['errsys' => $errno])
361
+            . "</blink><br />\n<b>"
362
+            . _T(
363
+                'info_erreur_systeme2',
364
+                ['script' => generer_url_ecrire('base_repair')]
365
+            )
366
+            . '</b><br />';
367
+            spip_logger()->info("Erreur systeme $errno");
368
+
369
+        return [$retour, ''];
370
+    }
371
+
372
+    // Requete erronee
373
+    $err = '<b>' . _T('avis_erreur_mysql') . " $errno</b><br /><tt>\n"
374
+        . spip_htmlspecialchars($msg)
375
+        . "\n<br /><span style='color: red'><b>"
376
+        . spip_htmlspecialchars($query)
377
+        . '</b></span></tt><br />';
378
+
379
+    //. aider('erreur_mysql');
380
+
381
+    return $err;
382 382
 }
383 383
 
384 384
 
385 385
 function trouve_boucle_debug($n, $nom, $debut = 0, $boucle = '') {
386 386
 
387
-	$id = $nom . $boucle;
388
-	if (is_array($GLOBALS['debug_objets']['sequence'][$id])) {
389
-		foreach ($GLOBALS['debug_objets']['sequence'][$id] as $v) {
390
-			if (!preg_match('/^(.*)(<\?.*\?>)(.*)$/s', (string) $v[0], $r)) {
391
-				$y = substr_count((string) $v[0], "\n");
392
-			} else {
393
-				if ($v[1][0] == '#') { // balise dynamique
394
-				$incl = $GLOBALS['debug_objets']['resultat'][$v[2]];
395
-				} else // inclusion
396
-				{
397
-					$incl = $GLOBALS['debug_objets']['squelette'][trouve_squelette_inclus($v[0])];
398
-				}
399
-				$y = substr_count((string) $incl, "\n")
400
-					+ substr_count($r[1], "\n")
401
-					+ substr_count($r[3], "\n");
402
-			}
403
-			if ($n <= ($y + $debut)) {
404
-				if ($v[1][0] == '?') {
405
-					return trouve_boucle_debug($n, $nom, $debut, substr((string) $v[1], 1));
406
-				} elseif ($v[1][0] == '!') {
407
-					if ($incl = trouve_squelette_inclus($v[1])) {
408
-						return trouve_boucle_debug($n, $incl, $debut);
409
-					}
410
-				}
411
-
412
-				return [$nom, $boucle, $v[2] - 1 + $n - $debut];
413
-			}
414
-			$debut += $y;
415
-		}
416
-	}
417
-
418
-	return [$nom, $boucle, $n - $debut];
387
+    $id = $nom . $boucle;
388
+    if (is_array($GLOBALS['debug_objets']['sequence'][$id])) {
389
+        foreach ($GLOBALS['debug_objets']['sequence'][$id] as $v) {
390
+            if (!preg_match('/^(.*)(<\?.*\?>)(.*)$/s', (string) $v[0], $r)) {
391
+                $y = substr_count((string) $v[0], "\n");
392
+            } else {
393
+                if ($v[1][0] == '#') { // balise dynamique
394
+                $incl = $GLOBALS['debug_objets']['resultat'][$v[2]];
395
+                } else // inclusion
396
+                {
397
+                    $incl = $GLOBALS['debug_objets']['squelette'][trouve_squelette_inclus($v[0])];
398
+                }
399
+                $y = substr_count((string) $incl, "\n")
400
+                    + substr_count($r[1], "\n")
401
+                    + substr_count($r[3], "\n");
402
+            }
403
+            if ($n <= ($y + $debut)) {
404
+                if ($v[1][0] == '?') {
405
+                    return trouve_boucle_debug($n, $nom, $debut, substr((string) $v[1], 1));
406
+                } elseif ($v[1][0] == '!') {
407
+                    if ($incl = trouve_squelette_inclus($v[1])) {
408
+                        return trouve_boucle_debug($n, $incl, $debut);
409
+                    }
410
+                }
411
+
412
+                return [$nom, $boucle, $v[2] - 1 + $n - $debut];
413
+            }
414
+            $debut += $y;
415
+        }
416
+    }
417
+
418
+    return [$nom, $boucle, $n - $debut];
419 419
 }
420 420
 
421 421
 function trouve_squelette_inclus($script) {
422 422
 
423
-	preg_match('/include\(.(.*).php3?.\);/', (string) $script, $reg);
424
-	// si le script X.php n'est pas ecrire/public.php
425
-	// on suppose qu'il prend le squelette X.html (pas sur, mais y a pas mieux)
426
-	// si c'est bien ecrire/public on cherche le param 'fond'
427
-	// a defaut on cherche le param 'page'
428
-	if (
429
-		$reg[1] == 'ecrire/public'
430
-		&& !preg_match("/'fond' => '([^']*)'/", (string) $script, $reg)
431
-		&& !preg_match("/'param' => '([^']*)'/", (string) $script, $reg)
432
-	) {
433
-		$reg[1] = 'inconnu';
434
-	}
435
-	$incl = ',' . $reg[1] . '[.]\w$,';
436
-
437
-	foreach ($GLOBALS['debug_objets']['sourcefile'] as $k => $v) {
438
-		if (preg_match($incl, (string) $v)) {
439
-			return $k;
440
-		}
441
-	}
442
-
443
-	return '';
423
+    preg_match('/include\(.(.*).php3?.\);/', (string) $script, $reg);
424
+    // si le script X.php n'est pas ecrire/public.php
425
+    // on suppose qu'il prend le squelette X.html (pas sur, mais y a pas mieux)
426
+    // si c'est bien ecrire/public on cherche le param 'fond'
427
+    // a defaut on cherche le param 'page'
428
+    if (
429
+        $reg[1] == 'ecrire/public'
430
+        && !preg_match("/'fond' => '([^']*)'/", (string) $script, $reg)
431
+        && !preg_match("/'param' => '([^']*)'/", (string) $script, $reg)
432
+    ) {
433
+        $reg[1] = 'inconnu';
434
+    }
435
+    $incl = ',' . $reg[1] . '[.]\w$,';
436
+
437
+    foreach ($GLOBALS['debug_objets']['sourcefile'] as $k => $v) {
438
+        if (preg_match($incl, (string) $v)) {
439
+            return $k;
440
+        }
441
+    }
442
+
443
+    return '';
444 444
 }
445 445
 
446 446
 function reference_boucle_debug($n, $nom, $self) {
447
-	[$skel, $boucle, $ligne] = trouve_boucle_debug($n, $nom);
448
-
449
-	if (!$boucle) {
450
-		return $ligne
451
-			? ' (' .
452
-				(($nom != $skel) ? _T('squelette_inclus_ligne') :
453
-					_T('squelette_ligne')) .
454
-				" <a href='$self&amp;var_mode_objet=$skel&amp;var_mode_affiche=squelette&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)"
455
-			: '';
456
-	} else {
457
-		$self .= "&amp;var_mode_objet=$skel$boucle&amp;var_mode_affiche=boucle";
458
-
459
-		return $ligne ? " (boucle $boucle ligne\n<a href='$self&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)" :
460
-			" (boucle\n<a href='$self#$skel$boucle'>$boucle</a>)";
461
-	}
447
+    [$skel, $boucle, $ligne] = trouve_boucle_debug($n, $nom);
448
+
449
+    if (!$boucle) {
450
+        return $ligne
451
+            ? ' (' .
452
+                (($nom != $skel) ? _T('squelette_inclus_ligne') :
453
+                    _T('squelette_ligne')) .
454
+                " <a href='$self&amp;var_mode_objet=$skel&amp;var_mode_affiche=squelette&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)"
455
+            : '';
456
+    } else {
457
+        $self .= "&amp;var_mode_objet=$skel$boucle&amp;var_mode_affiche=boucle";
458
+
459
+        return $ligne ? " (boucle $boucle ligne\n<a href='$self&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)" :
460
+            " (boucle\n<a href='$self#$skel$boucle'>$boucle</a>)";
461
+    }
462 462
 }
463 463
 
464 464
 // affiche un texte avec numero de ligne et ancre.
465 465
 
466 466
 function ancre_texte($texte, $fautifs = [], $nocpt = false) {
467 467
 
468
-	$var_mode_ligne = _request('var_mode_ligne');
469
-	if ($var_mode_ligne) {
470
-		$fautifs[] = [$var_mode_ligne];
471
-	}
472
-	$res = '';
473
-
474
-	$s = highlight_string($texte, true);
475
-	if (str_starts_with($s, '<code>')) {
476
-		$s = substr($s, 6);
477
-		$res = '<code>';
478
-	}
479
-
480
-	$s = preg_replace(
481
-		',<(\w[^<>]*)>([^<]*)<br />([^<]*)</\1>,',
482
-		'<\1>\2</\1><br />' . "\n" . '<\1>\3</\1>',
483
-		$s
484
-	);
485
-
486
-
487
-	$tableau = explode('<br />', $s);
488
-
489
-	$format = "<span style='float:left;display:block;width:50px;height:1px'><a id='L%d' style='background-color: white; visibility: " . ($nocpt ? 'hidden' : 'visible') . ";%s' href='#T%s' title=\"%s\">%0" . (string) @strlen(count($tableau)) . "d</a></span> %s<br />\n";
490
-
491
-	$format10 = str_replace('white', 'lightgrey', $format);
492
-	$formaterr = 'color: red;';
493
-	$i = 1;
494
-	$flignes = [];
495
-	$loc = [0, 0];
496
-	foreach ($fautifs as $lc) {
497
-		if (is_array($lc)) {
498
-			$l = array_shift($lc);
499
-			$flignes[$l] = $lc;
500
-		} else {
501
-			$flignes[$lc] = $loc;
502
-		}
503
-	}
504
-
505
-	$ancre = md5((string) $texte);
506
-	foreach ($tableau as $ligne) {
507
-		if (isset($flignes[$i])) {
508
-			$ligne = str_replace('&nbsp;', ' ', $ligne);
509
-			$indexmesg = $flignes[$i][1];
510
-			$err = textebrut($flignes[$i][2]);
511
-			// tentative de pointer sur la colonne fautive;
512
-			// marche pas car highlight_string rajoute des entites. A revoir.
513
-			// $m = $flignes[$i][0];
514
-			// $ligne = substr($ligne, 0, $m-1) .
515
-			// sprintf($formaterr, substr($ligne,$m));
516
-			$bg = $formaterr;
517
-		} else {
518
-			$indexmesg = $ancre;
519
-			$err = $bg = '';
520
-		}
521
-		$res .= sprintf((($i % 10) ? $format : $format10), $i, $bg, $indexmesg, $err, $i, $ligne);
522
-		$i++;
523
-	}
524
-
525
-	return "<div id='T$ancre'>"
526
-	. '<div onclick="'
527
-	. "jQuery(this).parent().find('a').toggle();"
528
-	. '" title="'
529
-	. _T('masquer_colonne')
530
-	. '" style="cursor: pointer;">'
531
-	. ($nocpt ? '' : _T('info_numero_abbreviation'))
532
-	. '</div>
468
+    $var_mode_ligne = _request('var_mode_ligne');
469
+    if ($var_mode_ligne) {
470
+        $fautifs[] = [$var_mode_ligne];
471
+    }
472
+    $res = '';
473
+
474
+    $s = highlight_string($texte, true);
475
+    if (str_starts_with($s, '<code>')) {
476
+        $s = substr($s, 6);
477
+        $res = '<code>';
478
+    }
479
+
480
+    $s = preg_replace(
481
+        ',<(\w[^<>]*)>([^<]*)<br />([^<]*)</\1>,',
482
+        '<\1>\2</\1><br />' . "\n" . '<\1>\3</\1>',
483
+        $s
484
+    );
485
+
486
+
487
+    $tableau = explode('<br />', $s);
488
+
489
+    $format = "<span style='float:left;display:block;width:50px;height:1px'><a id='L%d' style='background-color: white; visibility: " . ($nocpt ? 'hidden' : 'visible') . ";%s' href='#T%s' title=\"%s\">%0" . (string) @strlen(count($tableau)) . "d</a></span> %s<br />\n";
490
+
491
+    $format10 = str_replace('white', 'lightgrey', $format);
492
+    $formaterr = 'color: red;';
493
+    $i = 1;
494
+    $flignes = [];
495
+    $loc = [0, 0];
496
+    foreach ($fautifs as $lc) {
497
+        if (is_array($lc)) {
498
+            $l = array_shift($lc);
499
+            $flignes[$l] = $lc;
500
+        } else {
501
+            $flignes[$lc] = $loc;
502
+        }
503
+    }
504
+
505
+    $ancre = md5((string) $texte);
506
+    foreach ($tableau as $ligne) {
507
+        if (isset($flignes[$i])) {
508
+            $ligne = str_replace('&nbsp;', ' ', $ligne);
509
+            $indexmesg = $flignes[$i][1];
510
+            $err = textebrut($flignes[$i][2]);
511
+            // tentative de pointer sur la colonne fautive;
512
+            // marche pas car highlight_string rajoute des entites. A revoir.
513
+            // $m = $flignes[$i][0];
514
+            // $ligne = substr($ligne, 0, $m-1) .
515
+            // sprintf($formaterr, substr($ligne,$m));
516
+            $bg = $formaterr;
517
+        } else {
518
+            $indexmesg = $ancre;
519
+            $err = $bg = '';
520
+        }
521
+        $res .= sprintf((($i % 10) ? $format : $format10), $i, $bg, $indexmesg, $err, $i, $ligne);
522
+        $i++;
523
+    }
524
+
525
+    return "<div id='T$ancre'>"
526
+    . '<div onclick="'
527
+    . "jQuery(this).parent().find('a').toggle();"
528
+    . '" title="'
529
+    . _T('masquer_colonne')
530
+    . '" style="cursor: pointer;">'
531
+    . ($nocpt ? '' : _T('info_numero_abbreviation'))
532
+    . '</div>
533 533
 	' . $res . "</div>\n";
534 534
 }
535 535
 
536 536
 // l'environnement graphique du debuggueur
537 537
 
538 538
 function debusquer_squelette($fonc, $mode, $self) {
539
-	$legend = null;
540
-	$texte = '';
541
-
542
-	if ($mode !== 'validation') {
543
-		if (isset($GLOBALS['debug_objets']['sourcefile']) && $GLOBALS['debug_objets']['sourcefile']) {
544
-			$res = "<div id='spip-boucles'>\n"
545
-				. debusquer_navigation_squelettes($self)
546
-				. '</div>';
547
-		} else {
548
-			$res = '';
549
-		}
550
-		if ($fonc) {
551
-			$id = " id='$fonc'";
552
-			if (!empty($GLOBALS['debug_objets'][$mode][$fonc])) {
553
-				[$legend, $texte, $res2] = debusquer_source($fonc, $mode);
554
-				$texte .= $res2;
555
-			} elseif (!empty($GLOBALS['debug_objets'][$mode][$fonc . 'tout'])) {
556
-				$legend = _T('zbug_' . $mode);
557
-				$texte = $GLOBALS['debug_objets'][$mode][$fonc . 'tout'];
558
-				$texte = ancre_texte($texte, ['', '']);
559
-			}
560
-		} else {
561
-			if (strlen(trim($res))) {
562
-				return "<img src='" . chemin_image('debug-xx.svg') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res</div>";
563
-			} else {
564
-				// cas de l'appel sur erreur: montre la page
565
-				return $GLOBALS['debug_objets']['resultat']['tout'] ?? '';
566
-			}
567
-		}
568
-	} else {
569
-		$valider = charger_fonction('valider', 'xml');
570
-		$val = $valider($GLOBALS['debug_objets']['validation'][$fonc . 'tout']);
571
-		// Si erreur, signaler leur nombre dans le formulaire admin
572
-		$GLOBALS['debug_objets']['validation'] = $val->err ? count($val->err) : '';
573
-		[$texte, $err] = emboite_texte($val, $fonc, $self);
574
-		if ($err === false) {
575
-			$err = _T('impossible');
576
-		} elseif ($err === true) {
577
-			$err = _T('correcte');
578
-		} else {
579
-			$err = ": $err";
580
-		}
581
-		$legend = _T('validation') . ' ' . $err;
582
-		$res = $id = '';
583
-	}
584
-
585
-	return trim((string) $texte)
586
-		? "<img src='" . chemin_image('debug-xx.svg') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res"
587
-			. "<div id='debug_boucle'><fieldset$id><legend>"
588
-			. "<a href='" . $self . '#f_' . substr((string) $fonc, 0, 37) . "'> &#8593; "
589
-			. ($legend ?: $mode)
590
-			. '</a></legend>'
591
-			. $texte
592
-			. '</fieldset></div>'
593
-			. '</div>'
594
-		: '';
539
+    $legend = null;
540
+    $texte = '';
541
+
542
+    if ($mode !== 'validation') {
543
+        if (isset($GLOBALS['debug_objets']['sourcefile']) && $GLOBALS['debug_objets']['sourcefile']) {
544
+            $res = "<div id='spip-boucles'>\n"
545
+                . debusquer_navigation_squelettes($self)
546
+                . '</div>';
547
+        } else {
548
+            $res = '';
549
+        }
550
+        if ($fonc) {
551
+            $id = " id='$fonc'";
552
+            if (!empty($GLOBALS['debug_objets'][$mode][$fonc])) {
553
+                [$legend, $texte, $res2] = debusquer_source($fonc, $mode);
554
+                $texte .= $res2;
555
+            } elseif (!empty($GLOBALS['debug_objets'][$mode][$fonc . 'tout'])) {
556
+                $legend = _T('zbug_' . $mode);
557
+                $texte = $GLOBALS['debug_objets'][$mode][$fonc . 'tout'];
558
+                $texte = ancre_texte($texte, ['', '']);
559
+            }
560
+        } else {
561
+            if (strlen(trim($res))) {
562
+                return "<img src='" . chemin_image('debug-xx.svg') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res</div>";
563
+            } else {
564
+                // cas de l'appel sur erreur: montre la page
565
+                return $GLOBALS['debug_objets']['resultat']['tout'] ?? '';
566
+            }
567
+        }
568
+    } else {
569
+        $valider = charger_fonction('valider', 'xml');
570
+        $val = $valider($GLOBALS['debug_objets']['validation'][$fonc . 'tout']);
571
+        // Si erreur, signaler leur nombre dans le formulaire admin
572
+        $GLOBALS['debug_objets']['validation'] = $val->err ? count($val->err) : '';
573
+        [$texte, $err] = emboite_texte($val, $fonc, $self);
574
+        if ($err === false) {
575
+            $err = _T('impossible');
576
+        } elseif ($err === true) {
577
+            $err = _T('correcte');
578
+        } else {
579
+            $err = ": $err";
580
+        }
581
+        $legend = _T('validation') . ' ' . $err;
582
+        $res = $id = '';
583
+    }
584
+
585
+    return trim((string) $texte)
586
+        ? "<img src='" . chemin_image('debug-xx.svg') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res"
587
+            . "<div id='debug_boucle'><fieldset$id><legend>"
588
+            . "<a href='" . $self . '#f_' . substr((string) $fonc, 0, 37) . "'> &#8593; "
589
+            . ($legend ?: $mode)
590
+            . '</a></legend>'
591
+            . $texte
592
+            . '</fieldset></div>'
593
+            . '</div>'
594
+        : '';
595 595
 }
596 596
 
597 597
 
598 598
 function emboite_texte($res, $fonc = '', $self = '') {
599
-	$errs = $res->err;
600
-	$texte = $res->entete . ($errs ? '' : $res->page);
601
-
602
-	if (!$texte && !$errs) {
603
-		return [ancre_texte('', ['', '']), false];
604
-	}
605
-	if (!$errs) {
606
-		return [ancre_texte($texte, ['', '']), true];
607
-	}
608
-
609
-	if (!isset($GLOBALS['debug_objets'])) {
610
-		$colors = ['#e0e0f0', '#f8f8ff'];
611
-		$encore = count_occ($errs);
612
-		$encore2 = [];
613
-		$fautifs = [];
614
-
615
-		$err = '<tr><th>'
616
-			. _T('numero')
617
-			. '</th><th>'
618
-			. _T('occurence')
619
-			. '</th><th>'
620
-			. _T('ligne')
621
-			. '</th><th>'
622
-			. _T('colonne')
623
-			. '</th><th>'
624
-			. _T('erreur')
625
-			. '</th></tr>';
626
-
627
-		$i = 0;
628
-		$style = "style='text-align: right; padding-right: 5px'";
629
-		foreach ($errs as $r) {
630
-			$i++;
631
-			[$msg, $ligne, $col] = $r;
632
-			#spip_logger()->info("$r = [$msg, $ligne, $col]");
633
-			if (isset($encore2[$msg])) {
634
-				$ref = ++$encore2[$msg];
635
-			} else {
636
-				$encore2[$msg] = $ref = 1;
637
-			}
638
-			$err .= "<tr  style='background-color: "
639
-				. $colors[$i % 2]
640
-				. "'><td $style><a href='#debut_err'>"
641
-				. $i
642
-				. "</a></td><td $style>"
643
-				. "$ref/$encore[$msg]</td>"
644
-				. "<td $style><a href='#L"
645
-				. $ligne
646
-				. "' id='T$i'>"
647
-				. $ligne
648
-				. "</a></td><td $style>"
649
-				. $col
650
-				. "</td><td>$msg</td></tr>\n";
651
-			$fautifs[] = [$ligne, $col, $i, $msg];
652
-		}
653
-		$err = "<h2 style='text-align: center'>"
654
-			. $i
655
-			. "<a href='#fin_err'>"
656
-			. ' ' . _T('erreur_texte')
657
-			. "</a></h2><table id='debut_err' style='width: 100%'>"
658
-			. $err
659
-			. " </table><a id='fin_err'></a>";
660
-
661
-		return [ancre_texte($texte, $fautifs), $err];
662
-	} else {
663
-		[$msg, $fermant, $ouvrant] = $errs[0];
664
-		$rf = reference_boucle_debug($fermant, $fonc, $self);
665
-		$ro = reference_boucle_debug($ouvrant, $fonc, $self);
666
-		$err = $msg .
667
-			"<a href='#L" . $fermant . "'>$fermant</a>$rf<br />" .
668
-			"<a href='#L" . $ouvrant . "'>$ouvrant</a>$ro";
669
-
670
-		return [ancre_texte($texte, [[$ouvrant], [$fermant]]), $err];
671
-	}
599
+    $errs = $res->err;
600
+    $texte = $res->entete . ($errs ? '' : $res->page);
601
+
602
+    if (!$texte && !$errs) {
603
+        return [ancre_texte('', ['', '']), false];
604
+    }
605
+    if (!$errs) {
606
+        return [ancre_texte($texte, ['', '']), true];
607
+    }
608
+
609
+    if (!isset($GLOBALS['debug_objets'])) {
610
+        $colors = ['#e0e0f0', '#f8f8ff'];
611
+        $encore = count_occ($errs);
612
+        $encore2 = [];
613
+        $fautifs = [];
614
+
615
+        $err = '<tr><th>'
616
+            . _T('numero')
617
+            . '</th><th>'
618
+            . _T('occurence')
619
+            . '</th><th>'
620
+            . _T('ligne')
621
+            . '</th><th>'
622
+            . _T('colonne')
623
+            . '</th><th>'
624
+            . _T('erreur')
625
+            . '</th></tr>';
626
+
627
+        $i = 0;
628
+        $style = "style='text-align: right; padding-right: 5px'";
629
+        foreach ($errs as $r) {
630
+            $i++;
631
+            [$msg, $ligne, $col] = $r;
632
+            #spip_logger()->info("$r = [$msg, $ligne, $col]");
633
+            if (isset($encore2[$msg])) {
634
+                $ref = ++$encore2[$msg];
635
+            } else {
636
+                $encore2[$msg] = $ref = 1;
637
+            }
638
+            $err .= "<tr  style='background-color: "
639
+                . $colors[$i % 2]
640
+                . "'><td $style><a href='#debut_err'>"
641
+                . $i
642
+                . "</a></td><td $style>"
643
+                . "$ref/$encore[$msg]</td>"
644
+                . "<td $style><a href='#L"
645
+                . $ligne
646
+                . "' id='T$i'>"
647
+                . $ligne
648
+                . "</a></td><td $style>"
649
+                . $col
650
+                . "</td><td>$msg</td></tr>\n";
651
+            $fautifs[] = [$ligne, $col, $i, $msg];
652
+        }
653
+        $err = "<h2 style='text-align: center'>"
654
+            . $i
655
+            . "<a href='#fin_err'>"
656
+            . ' ' . _T('erreur_texte')
657
+            . "</a></h2><table id='debut_err' style='width: 100%'>"
658
+            . $err
659
+            . " </table><a id='fin_err'></a>";
660
+
661
+        return [ancre_texte($texte, $fautifs), $err];
662
+    } else {
663
+        [$msg, $fermant, $ouvrant] = $errs[0];
664
+        $rf = reference_boucle_debug($fermant, $fonc, $self);
665
+        $ro = reference_boucle_debug($ouvrant, $fonc, $self);
666
+        $err = $msg .
667
+            "<a href='#L" . $fermant . "'>$fermant</a>$rf<br />" .
668
+            "<a href='#L" . $ouvrant . "'>$ouvrant</a>$ro";
669
+
670
+        return [ancre_texte($texte, [[$ouvrant], [$fermant]]), $err];
671
+    }
672 672
 }
673 673
 
674 674
 function count_occ($regs) {
675
-	$encore = [];
676
-	foreach ($regs as $r) {
677
-		if (isset($encore[$r[0]])) {
678
-			$encore[$r[0]]++;
679
-		} else {
680
-			$encore[$r[0]] = 1;
681
-		}
682
-	}
683
-
684
-	return $encore;
675
+    $encore = [];
676
+    foreach ($regs as $r) {
677
+        if (isset($encore[$r[0]])) {
678
+            $encore[$r[0]]++;
679
+        } else {
680
+            $encore[$r[0]] = 1;
681
+        }
682
+    }
683
+
684
+    return $encore;
685 685
 }
686 686
 
687 687
 function debusquer_navigation_squelettes($self) {
688 688
 
689
-	$res = '';
690
-	$boucles = empty($GLOBALS['debug_objets']['boucle']) ? '' : $GLOBALS['debug_objets']['boucle'];
691
-	$contexte = $GLOBALS['debug_objets']['contexte'];
692
-	$t_skel = _T('squelette');
693
-	foreach ($GLOBALS['debug_objets']['sourcefile'] as $nom => $sourcefile) {
694
-		$self2 = parametre_url($self, 'var_mode_objet', $nom);
695
-		$nav = $boucles ? debusquer_navigation_boucles($boucles, $nom, $self, $sourcefile) : '';
696
-		$temps = isset($GLOBALS['debug_objets']['profile'][$sourcefile]) ? _T(
697
-			'zbug_profile',
698
-			['time' => $GLOBALS['debug_objets']['profile'][$sourcefile]]
699
-		) : '';
700
-
701
-		$res .= "<fieldset id='f_" . $nom . "'><legend>"
702
-			. $t_skel
703
-			. ' '
704
-			. $sourcefile
705
-			. "&nbsp;:\n<a href='$self2&amp;var_mode_affiche=squelette#f_$nom'>"
706
-			. $t_skel
707
-			. "</a>\n<a href='$self2&amp;var_mode_affiche=resultat#f_$nom'>"
708
-			. _T('zbug_resultat')
709
-			. "</a>\n<a href='$self2&amp;var_mode_affiche=code#f_$nom'>"
710
-			. _T('zbug_code')
711
-			. "</a>\n<a href='"
712
-			. str_replace('var_mode=debug', 'var_profile=1&amp;var_mode=recalcul', (string) $self)
713
-			. "'>"
714
-			. _T('zbug_calcul')
715
-			. '</a></legend>'
716
-			. ($temps ? "\n<span style='display:block;float:" . $GLOBALS['spip_lang_right'] . "'>$temps</span><br />" : (''))
717
-			. debusquer_contexte($contexte[$sourcefile])
718
-		. ($nav ? "<table width='100%'>\n$nav</table>\n" : (''))
719
-		. "</fieldset>\n";
720
-	}
721
-
722
-	return $res;
689
+    $res = '';
690
+    $boucles = empty($GLOBALS['debug_objets']['boucle']) ? '' : $GLOBALS['debug_objets']['boucle'];
691
+    $contexte = $GLOBALS['debug_objets']['contexte'];
692
+    $t_skel = _T('squelette');
693
+    foreach ($GLOBALS['debug_objets']['sourcefile'] as $nom => $sourcefile) {
694
+        $self2 = parametre_url($self, 'var_mode_objet', $nom);
695
+        $nav = $boucles ? debusquer_navigation_boucles($boucles, $nom, $self, $sourcefile) : '';
696
+        $temps = isset($GLOBALS['debug_objets']['profile'][$sourcefile]) ? _T(
697
+            'zbug_profile',
698
+            ['time' => $GLOBALS['debug_objets']['profile'][$sourcefile]]
699
+        ) : '';
700
+
701
+        $res .= "<fieldset id='f_" . $nom . "'><legend>"
702
+            . $t_skel
703
+            . ' '
704
+            . $sourcefile
705
+            . "&nbsp;:\n<a href='$self2&amp;var_mode_affiche=squelette#f_$nom'>"
706
+            . $t_skel
707
+            . "</a>\n<a href='$self2&amp;var_mode_affiche=resultat#f_$nom'>"
708
+            . _T('zbug_resultat')
709
+            . "</a>\n<a href='$self2&amp;var_mode_affiche=code#f_$nom'>"
710
+            . _T('zbug_code')
711
+            . "</a>\n<a href='"
712
+            . str_replace('var_mode=debug', 'var_profile=1&amp;var_mode=recalcul', (string) $self)
713
+            . "'>"
714
+            . _T('zbug_calcul')
715
+            . '</a></legend>'
716
+            . ($temps ? "\n<span style='display:block;float:" . $GLOBALS['spip_lang_right'] . "'>$temps</span><br />" : (''))
717
+            . debusquer_contexte($contexte[$sourcefile])
718
+        . ($nav ? "<table width='100%'>\n$nav</table>\n" : (''))
719
+        . "</fieldset>\n";
720
+    }
721
+
722
+    return $res;
723 723
 }
724 724
 
725 725
 function debusquer_navigation_boucles($boucles, $nom_skel, $self, $nom_source) {
726
-	$i = 0;
727
-	$res = '';
728
-	$var_mode_objet = _request('var_mode_objet');
729
-	$gram = preg_match('/[.](\w+)$/', (string) $nom_source, $r) ? $r[1] : '';
730
-
731
-	foreach ($boucles as $objet => $boucle) {
732
-		if (str_starts_with((string) $objet, (string) $nom_skel)) {
733
-			$i++;
734
-			$nom = $boucle->id_boucle;
735
-			$req = $boucle->type_requete;
736
-			$crit = public_decompiler($boucle, $gram, 0, 'criteres');
737
-			$self2 = $self . '&amp;var_mode_objet=' . $objet;
738
-
739
-			$res .= "\n<tr style='background-color: " .
740
-				($i % 2 ? '#e0e0f0' : '#f8f8ff') .
741
-				"'><td  align='right'>$i</td><td>\n" .
742
-				"<a  class='debug_link_boucle' href='" .
743
-				$self2 .
744
-				"&amp;var_mode_affiche=boucle#f_$nom_skel'>" .
745
-				_T('zbug_boucle') .
746
-				"</a></td><td>\n<a class='debug_link_boucle' href='" .
747
-				$self2 .
748
-				"&amp;var_mode_affiche=resultat#f_$nom_skel'>" .
749
-				_T('zbug_resultat') .
750
-				"</a></td><td>\n<a class='debug_link_resultat' href='" .
751
-				$self2 .
752
-				"&amp;var_mode_affiche=code#f_$nom_skel'>" .
753
-				_T('zbug_code') .
754
-				"</a></td><td>\n<a class='debug_link_resultat' href='" .
755
-				str_replace('var_mode=', 'var_profile=', $self2) .
756
-				"'>" .
757
-				_T('zbug_calcul') .
758
-				"</a></td><td>\n" .
759
-				(($var_mode_objet == $objet) ? "<b>$nom</b>" : $nom) .
760
-				"</td><td>\n" .
761
-				$req .
762
-				"</td><td>\n" .
763
-				spip_htmlspecialchars($crit) .
764
-				'</td></tr>';
765
-		}
766
-	}
767
-
768
-	return $res;
726
+    $i = 0;
727
+    $res = '';
728
+    $var_mode_objet = _request('var_mode_objet');
729
+    $gram = preg_match('/[.](\w+)$/', (string) $nom_source, $r) ? $r[1] : '';
730
+
731
+    foreach ($boucles as $objet => $boucle) {
732
+        if (str_starts_with((string) $objet, (string) $nom_skel)) {
733
+            $i++;
734
+            $nom = $boucle->id_boucle;
735
+            $req = $boucle->type_requete;
736
+            $crit = public_decompiler($boucle, $gram, 0, 'criteres');
737
+            $self2 = $self . '&amp;var_mode_objet=' . $objet;
738
+
739
+            $res .= "\n<tr style='background-color: " .
740
+                ($i % 2 ? '#e0e0f0' : '#f8f8ff') .
741
+                "'><td  align='right'>$i</td><td>\n" .
742
+                "<a  class='debug_link_boucle' href='" .
743
+                $self2 .
744
+                "&amp;var_mode_affiche=boucle#f_$nom_skel'>" .
745
+                _T('zbug_boucle') .
746
+                "</a></td><td>\n<a class='debug_link_boucle' href='" .
747
+                $self2 .
748
+                "&amp;var_mode_affiche=resultat#f_$nom_skel'>" .
749
+                _T('zbug_resultat') .
750
+                "</a></td><td>\n<a class='debug_link_resultat' href='" .
751
+                $self2 .
752
+                "&amp;var_mode_affiche=code#f_$nom_skel'>" .
753
+                _T('zbug_code') .
754
+                "</a></td><td>\n<a class='debug_link_resultat' href='" .
755
+                str_replace('var_mode=', 'var_profile=', $self2) .
756
+                "'>" .
757
+                _T('zbug_calcul') .
758
+                "</a></td><td>\n" .
759
+                (($var_mode_objet == $objet) ? "<b>$nom</b>" : $nom) .
760
+                "</td><td>\n" .
761
+                $req .
762
+                "</td><td>\n" .
763
+                spip_htmlspecialchars($crit) .
764
+                '</td></tr>';
765
+        }
766
+    }
767
+
768
+    return $res;
769 769
 }
770 770
 
771 771
 function debusquer_source($objet, $affiche) {
772
-	$quoi = $GLOBALS['debug_objets'][$affiche][$objet];
773
-	if (!empty($GLOBALS['debug_objets']['boucle'][$objet]->id_boucle)) {
774
-		$nom = $GLOBALS['debug_objets']['boucle'][$objet]->id_boucle;
775
-	} else {
776
-		$nom = $GLOBALS['debug_objets']['sourcefile'][$objet];
777
-	}
778
-	$res2 = '';
779
-
780
-	if ($affiche == 'resultat') {
781
-		$legend = $nom;
782
-		$req = $GLOBALS['debug_objets']['requete'][$objet];
783
-		if (function_exists('_mysql_traite_query')) {
784
-			$c = strtolower(_request('connect') ?? '');
785
-			$c = $GLOBALS['connexions'][$c ?: 0]['prefixe'];
786
-			$req = _mysql_traite_query($req, '', $c);
787
-		}
788
-		//  permettre le copier/coller facile
789
-		// $res = ancre_texte($req, array(), true);
790
-		$res = "<div id='T" . md5((string) $req) . "'>\n<pre>\n" . $req . "</pre>\n</div>\n";
791
-		//  formatage et affichage des resultats bruts de la requete
792
-		$ress_req = spip_query($req);
793
-		$brut_sql = '';
794
-		$num = 1;
795
-		//  eviter l'affichage de milliers de lignes
796
-		//  personnalisation possible dans mes_options
797
-		$max_aff = defined('_MAX_DEBUG_AFF') ? _MAX_DEBUG_AFF : 50;
798
-		while ($retours_sql = sql_fetch($ress_req)) {
799
-			if ($num <= $max_aff) {
800
-				$brut_sql .= '<h3>' . ($num == 1 ? $num . ' sur ' . sql_count($ress_req) : $num) . '</h3>';
801
-				$brut_sql .= '<p>';
802
-				foreach ($retours_sql as $key => $val) {
803
-					$brut_sql .= '<strong>' . $key . '</strong> => ' . spip_htmlspecialchars(couper($val, 150)) . "<br />\n";
804
-				}
805
-				$brut_sql .= '</p>';
806
-			}
807
-			$num++;
808
-		}
809
-		$res2 = interdire_scripts($brut_sql);
810
-		foreach ($quoi as $view) {
811
-			//  ne pas afficher les $contexte_inclus
812
-			$view = preg_replace(',<\?php.+\?[>],Uims', '', (string) $view);
813
-			if ($view) {
814
-				$res2 .= "\n<br /><fieldset>" . interdire_scripts($view) . '</fieldset>';
815
-			}
816
-		}
817
-	} elseif ($affiche == 'code') {
818
-		$legend = $nom;
819
-		$res = ancre_texte('<' . "?php\n" . $quoi . "\n?" . '>');
820
-	} elseif ($affiche == 'boucle') {
821
-		$legend = _T('zbug_boucle') . ' ' . $nom;
822
-		// Le compilateur prefixe le nom des boucles par l'extension du fichier source.
823
-		$gram = preg_match('/^([^_]+)_/', (string) $objet, $r) ? $r[1] : '';
824
-		$res = ancre_texte(public_decompiler($quoi, $gram, 0, 'boucle'));
825
-	} elseif ($affiche == 'squelette') {
826
-		$legend = $GLOBALS['debug_objets']['sourcefile'][$objet];
827
-		$res = ancre_texte($GLOBALS['debug_objets']['squelette'][$objet]);
828
-	}
829
-
830
-	return [$legend, $res, $res2];
772
+    $quoi = $GLOBALS['debug_objets'][$affiche][$objet];
773
+    if (!empty($GLOBALS['debug_objets']['boucle'][$objet]->id_boucle)) {
774
+        $nom = $GLOBALS['debug_objets']['boucle'][$objet]->id_boucle;
775
+    } else {
776
+        $nom = $GLOBALS['debug_objets']['sourcefile'][$objet];
777
+    }
778
+    $res2 = '';
779
+
780
+    if ($affiche == 'resultat') {
781
+        $legend = $nom;
782
+        $req = $GLOBALS['debug_objets']['requete'][$objet];
783
+        if (function_exists('_mysql_traite_query')) {
784
+            $c = strtolower(_request('connect') ?? '');
785
+            $c = $GLOBALS['connexions'][$c ?: 0]['prefixe'];
786
+            $req = _mysql_traite_query($req, '', $c);
787
+        }
788
+        //  permettre le copier/coller facile
789
+        // $res = ancre_texte($req, array(), true);
790
+        $res = "<div id='T" . md5((string) $req) . "'>\n<pre>\n" . $req . "</pre>\n</div>\n";
791
+        //  formatage et affichage des resultats bruts de la requete
792
+        $ress_req = spip_query($req);
793
+        $brut_sql = '';
794
+        $num = 1;
795
+        //  eviter l'affichage de milliers de lignes
796
+        //  personnalisation possible dans mes_options
797
+        $max_aff = defined('_MAX_DEBUG_AFF') ? _MAX_DEBUG_AFF : 50;
798
+        while ($retours_sql = sql_fetch($ress_req)) {
799
+            if ($num <= $max_aff) {
800
+                $brut_sql .= '<h3>' . ($num == 1 ? $num . ' sur ' . sql_count($ress_req) : $num) . '</h3>';
801
+                $brut_sql .= '<p>';
802
+                foreach ($retours_sql as $key => $val) {
803
+                    $brut_sql .= '<strong>' . $key . '</strong> => ' . spip_htmlspecialchars(couper($val, 150)) . "<br />\n";
804
+                }
805
+                $brut_sql .= '</p>';
806
+            }
807
+            $num++;
808
+        }
809
+        $res2 = interdire_scripts($brut_sql);
810
+        foreach ($quoi as $view) {
811
+            //  ne pas afficher les $contexte_inclus
812
+            $view = preg_replace(',<\?php.+\?[>],Uims', '', (string) $view);
813
+            if ($view) {
814
+                $res2 .= "\n<br /><fieldset>" . interdire_scripts($view) . '</fieldset>';
815
+            }
816
+        }
817
+    } elseif ($affiche == 'code') {
818
+        $legend = $nom;
819
+        $res = ancre_texte('<' . "?php\n" . $quoi . "\n?" . '>');
820
+    } elseif ($affiche == 'boucle') {
821
+        $legend = _T('zbug_boucle') . ' ' . $nom;
822
+        // Le compilateur prefixe le nom des boucles par l'extension du fichier source.
823
+        $gram = preg_match('/^([^_]+)_/', (string) $objet, $r) ? $r[1] : '';
824
+        $res = ancre_texte(public_decompiler($quoi, $gram, 0, 'boucle'));
825
+    } elseif ($affiche == 'squelette') {
826
+        $legend = $GLOBALS['debug_objets']['sourcefile'][$objet];
827
+        $res = ancre_texte($GLOBALS['debug_objets']['squelette'][$objet]);
828
+    }
829
+
830
+    return [$legend, $res, $res2];
831 831
 }
832 832
 
833 833
 function debusquer_entete($titre, $corps) {
834 834
 
835
-	include_spip('balise/formulaire_admin');
836
-	include_spip('public/assembler'); // pour inclure_balise_dynamique
837
-	include_spip('inc/texte'); // pour corriger_typo
838
-
839
-	return _DOCTYPE_ECRIRE .
840
-	html_lang_attributes() .
841
-	"<head>\n<title>" .
842
-	('SPIP ' . $GLOBALS['spip_version_affichee'] . ' ' .
843
-		_T('admin_debug') . ' ' . spip_htmlspecialchars($titre) . ' (' .
844
-		supprimer_tags(corriger_typo($GLOBALS['meta']['nom_site']))) .
845
-	")</title>\n" .
846
-	"<meta http-equiv='Content-Type' content='text/html" .
847
-	(($c = $GLOBALS['meta']['charset']) ? "; charset=$c" : '') .
848
-	"' />\n" .
849
-	http_script('', 'jquery.js')
850
-	. "<link rel='stylesheet' href='" . url_absolue(find_in_path('spip_admin.css'))
851
-	. "' type='text/css' />" .
852
-	"</head>\n" .
853
-	"<body style='margin:0 10px;'>\n" .
854
-	"<div id='spip-debug-header'>" .
855
-	$corps .
856
-	inclure_balise_dynamique(balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $GLOBALS['debug_objets']), false) .
857
-	'</div></body></html>';
835
+    include_spip('balise/formulaire_admin');
836
+    include_spip('public/assembler'); // pour inclure_balise_dynamique
837
+    include_spip('inc/texte'); // pour corriger_typo
838
+
839
+    return _DOCTYPE_ECRIRE .
840
+    html_lang_attributes() .
841
+    "<head>\n<title>" .
842
+    ('SPIP ' . $GLOBALS['spip_version_affichee'] . ' ' .
843
+        _T('admin_debug') . ' ' . spip_htmlspecialchars($titre) . ' (' .
844
+        supprimer_tags(corriger_typo($GLOBALS['meta']['nom_site']))) .
845
+    ")</title>\n" .
846
+    "<meta http-equiv='Content-Type' content='text/html" .
847
+    (($c = $GLOBALS['meta']['charset']) ? "; charset=$c" : '') .
848
+    "' />\n" .
849
+    http_script('', 'jquery.js')
850
+    . "<link rel='stylesheet' href='" . url_absolue(find_in_path('spip_admin.css'))
851
+    . "' type='text/css' />" .
852
+    "</head>\n" .
853
+    "<body style='margin:0 10px;'>\n" .
854
+    "<div id='spip-debug-header'>" .
855
+    $corps .
856
+    inclure_balise_dynamique(balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $GLOBALS['debug_objets']), false) .
857
+    '</div></body></html>';
858 858
 }
Please login to merge, or discard this patch.
Spacing   +86 added lines, -88 removed lines patch added patch discarded remove patch
@@ -146,7 +146,7 @@  discard block
 block discarded – undo
146 146
 		if (!$fonc) {
147 147
 			$fonc = $GLOBALS['debug_objets']['principal'];
148 148
 		}
149
-		$titre = $mode ? $mode . (isset($GLOBALS['debug_objets']['sourcefile'][$fonc]) ? ' ' . $GLOBALS['debug_objets']['sourcefile'][$fonc] : '') : ($fonc);
149
+		$titre = $mode ? $mode.(isset($GLOBALS['debug_objets']['sourcefile'][$fonc]) ? ' '.$GLOBALS['debug_objets']['sourcefile'][$fonc] : '') : ($fonc);
150 150
 	}
151 151
 	if ($message === false) {
152 152
 		lang_select();
@@ -169,7 +169,7 @@  discard block
 block discarded – undo
169 169
 	$fond = $GLOBALS['fond'] ?? '';
170 170
 	// une erreur critique sort $message en array
171 171
 	$debug = is_array($msg) ? $msg[1] : $msg;
172
-	spip_logger()->info('Debug: ' . $debug . ' (' . $fond . ')');
172
+	spip_logger()->info('Debug: '.$debug.' ('.$fond.')');
173 173
 
174 174
 	return $msg;
175 175
 }
@@ -177,7 +177,7 @@  discard block
 block discarded – undo
177 177
 function debusquer_bandeau($erreurs) {
178 178
 
179 179
 	if (!empty($erreurs)) {
180
-		$n = [(is_countable($erreurs) ? count($erreurs) : 0) . ' ' . _T('zbug_erreur_squelette')];
180
+		$n = [(is_countable($erreurs) ? count($erreurs) : 0).' '._T('zbug_erreur_squelette')];
181 181
 
182 182
 		return debusquer_navigation($erreurs, $n);
183 183
 	} elseif (!empty($GLOBALS['tableau_des_temps'])) {
@@ -210,25 +210,25 @@  discard block
 block discarded – undo
210 210
 			$valeur_simple = [];
211 211
 			foreach ($valeur as $v) {
212 212
 				if (is_array($v)) {
213
-					$valeur_simple[] = 'array:' . count($v);
213
+					$valeur_simple[] = 'array:'.count($v);
214 214
 				} elseif (is_object($v)) {
215 215
 					$valeur_simple[] = $v::class;
216 216
 				} elseif (is_string($v)) {
217
-					$valeur_simple[] = "'" . $v . "'";
217
+					$valeur_simple[] = "'".$v."'";
218 218
 				} else {
219 219
 					$valeur_simple[] = $v;
220 220
 				}
221 221
 			}
222 222
 			$n = count($valeur);
223
-			$valeur = (($n > 3) ? 'array:' . $n . ' ' : '');
224
-			$valeur .= '[' . implode(', ', $valeur_simple) . ']';
223
+			$valeur = (($n > 3) ? 'array:'.$n.' ' : '');
224
+			$valeur .= '['.implode(', ', $valeur_simple).']';
225 225
 		} elseif (is_object($valeur)) {
226 226
 			$valeur = $valeur::class;
227 227
 		} elseif (is_string($valeur)) {
228
-			$valeur = "'" . $valeur . "'";
228
+			$valeur = "'".$valeur."'";
229 229
 		}
230
-		$res .= "\n<tr><td><strong>" . nl2br((string) entites_html($nom))
231
-			. '</strong></td><td>:&nbsp;' . nl2br((string) entites_html($valeur))
230
+		$res .= "\n<tr><td><strong>".nl2br((string) entites_html($nom))
231
+			. '</strong></td><td>:&nbsp;'.nl2br((string) entites_html($valeur))
232 232
 			. "</td></tr>\n";
233 233
 	}
234 234
 
@@ -278,10 +278,10 @@  discard block
 block discarded – undo
278 278
 				$nom_code = $lieu->descr['nom'];
279 279
 				$skel = $lieu->descr['sourcefile'];
280 280
 				$h2 = parametre_url($href, 'var_mode_objet', $nom_code);
281
-				$h3 = parametre_url($h2, 'var_mode_affiche', 'squelette') . '#L' . $ligne;
281
+				$h3 = parametre_url($h2, 'var_mode_affiche', 'squelette').'#L'.$ligne;
282 282
 				$skel = "<a href='$h3'><b>$skel</b></a>";
283 283
 				if ($boucle) {
284
-					$h3 = parametre_url($h2 . $boucle, 'var_mode_affiche', 'boucle');
284
+					$h3 = parametre_url($h2.$boucle, 'var_mode_affiche', 'boucle');
285 285
 					$boucle = "<a href='$h3'><b>$boucle</b></a>";
286 286
 				}
287 287
 			}
@@ -370,7 +370,7 @@  discard block
 block discarded – undo
370 370
 	}
371 371
 
372 372
 	// Requete erronee
373
-	$err = '<b>' . _T('avis_erreur_mysql') . " $errno</b><br /><tt>\n"
373
+	$err = '<b>'._T('avis_erreur_mysql')." $errno</b><br /><tt>\n"
374 374
 		. spip_htmlspecialchars($msg)
375 375
 		. "\n<br /><span style='color: red'><b>"
376 376
 		. spip_htmlspecialchars($query)
@@ -384,7 +384,7 @@  discard block
 block discarded – undo
384 384
 
385 385
 function trouve_boucle_debug($n, $nom, $debut = 0, $boucle = '') {
386 386
 
387
-	$id = $nom . $boucle;
387
+	$id = $nom.$boucle;
388 388
 	if (is_array($GLOBALS['debug_objets']['sequence'][$id])) {
389 389
 		foreach ($GLOBALS['debug_objets']['sequence'][$id] as $v) {
390 390
 			if (!preg_match('/^(.*)(<\?.*\?>)(.*)$/s', (string) $v[0], $r)) {
@@ -432,7 +432,7 @@  discard block
 block discarded – undo
432 432
 	) {
433 433
 		$reg[1] = 'inconnu';
434 434
 	}
435
-	$incl = ',' . $reg[1] . '[.]\w$,';
435
+	$incl = ','.$reg[1].'[.]\w$,';
436 436
 
437 437
 	foreach ($GLOBALS['debug_objets']['sourcefile'] as $k => $v) {
438 438
 		if (preg_match($incl, (string) $v)) {
@@ -448,16 +448,14 @@  discard block
 block discarded – undo
448 448
 
449 449
 	if (!$boucle) {
450 450
 		return $ligne
451
-			? ' (' .
452
-				(($nom != $skel) ? _T('squelette_inclus_ligne') :
453
-					_T('squelette_ligne')) .
451
+			? ' ('.
452
+				(($nom != $skel) ? _T('squelette_inclus_ligne') : _T('squelette_ligne')).
454 453
 				" <a href='$self&amp;var_mode_objet=$skel&amp;var_mode_affiche=squelette&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)"
455 454
 			: '';
456 455
 	} else {
457 456
 		$self .= "&amp;var_mode_objet=$skel$boucle&amp;var_mode_affiche=boucle";
458 457
 
459
-		return $ligne ? " (boucle $boucle ligne\n<a href='$self&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)" :
460
-			" (boucle\n<a href='$self#$skel$boucle'>$boucle</a>)";
458
+		return $ligne ? " (boucle $boucle ligne\n<a href='$self&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)" : " (boucle\n<a href='$self#$skel$boucle'>$boucle</a>)";
461 459
 	}
462 460
 }
463 461
 
@@ -479,14 +477,14 @@  discard block
 block discarded – undo
479 477
 
480 478
 	$s = preg_replace(
481 479
 		',<(\w[^<>]*)>([^<]*)<br />([^<]*)</\1>,',
482
-		'<\1>\2</\1><br />' . "\n" . '<\1>\3</\1>',
480
+		'<\1>\2</\1><br />'."\n".'<\1>\3</\1>',
483 481
 		$s
484 482
 	);
485 483
 
486 484
 
487 485
 	$tableau = explode('<br />', $s);
488 486
 
489
-	$format = "<span style='float:left;display:block;width:50px;height:1px'><a id='L%d' style='background-color: white; visibility: " . ($nocpt ? 'hidden' : 'visible') . ";%s' href='#T%s' title=\"%s\">%0" . (string) @strlen(count($tableau)) . "d</a></span> %s<br />\n";
487
+	$format = "<span style='float:left;display:block;width:50px;height:1px'><a id='L%d' style='background-color: white; visibility: ".($nocpt ? 'hidden' : 'visible').";%s' href='#T%s' title=\"%s\">%0".(string) @strlen(count($tableau))."d</a></span> %s<br />\n";
490 488
 
491 489
 	$format10 = str_replace('white', 'lightgrey', $format);
492 490
 	$formaterr = 'color: red;';
@@ -530,7 +528,7 @@  discard block
 block discarded – undo
530 528
 	. '" style="cursor: pointer;">'
531 529
 	. ($nocpt ? '' : _T('info_numero_abbreviation'))
532 530
 	. '</div>
533
-	' . $res . "</div>\n";
531
+	' . $res."</div>\n";
534 532
 }
535 533
 
536 534
 // l'environnement graphique du debuggueur
@@ -552,14 +550,14 @@  discard block
 block discarded – undo
552 550
 			if (!empty($GLOBALS['debug_objets'][$mode][$fonc])) {
553 551
 				[$legend, $texte, $res2] = debusquer_source($fonc, $mode);
554 552
 				$texte .= $res2;
555
-			} elseif (!empty($GLOBALS['debug_objets'][$mode][$fonc . 'tout'])) {
556
-				$legend = _T('zbug_' . $mode);
557
-				$texte = $GLOBALS['debug_objets'][$mode][$fonc . 'tout'];
553
+			} elseif (!empty($GLOBALS['debug_objets'][$mode][$fonc.'tout'])) {
554
+				$legend = _T('zbug_'.$mode);
555
+				$texte = $GLOBALS['debug_objets'][$mode][$fonc.'tout'];
558 556
 				$texte = ancre_texte($texte, ['', '']);
559 557
 			}
560 558
 		} else {
561 559
 			if (strlen(trim($res))) {
562
-				return "<img src='" . chemin_image('debug-xx.svg') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res</div>";
560
+				return "<img src='".chemin_image('debug-xx.svg')."' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res</div>";
563 561
 			} else {
564 562
 				// cas de l'appel sur erreur: montre la page
565 563
 				return $GLOBALS['debug_objets']['resultat']['tout'] ?? '';
@@ -567,7 +565,7 @@  discard block
 block discarded – undo
567 565
 		}
568 566
 	} else {
569 567
 		$valider = charger_fonction('valider', 'xml');
570
-		$val = $valider($GLOBALS['debug_objets']['validation'][$fonc . 'tout']);
568
+		$val = $valider($GLOBALS['debug_objets']['validation'][$fonc.'tout']);
571 569
 		// Si erreur, signaler leur nombre dans le formulaire admin
572 570
 		$GLOBALS['debug_objets']['validation'] = $val->err ? count($val->err) : '';
573 571
 		[$texte, $err] = emboite_texte($val, $fonc, $self);
@@ -578,14 +576,14 @@  discard block
 block discarded – undo
578 576
 		} else {
579 577
 			$err = ": $err";
580 578
 		}
581
-		$legend = _T('validation') . ' ' . $err;
579
+		$legend = _T('validation').' '.$err;
582 580
 		$res = $id = '';
583 581
 	}
584 582
 
585 583
 	return trim((string) $texte)
586
-		? "<img src='" . chemin_image('debug-xx.svg') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res"
584
+		? "<img src='".chemin_image('debug-xx.svg')."' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res"
587 585
 			. "<div id='debug_boucle'><fieldset$id><legend>"
588
-			. "<a href='" . $self . '#f_' . substr((string) $fonc, 0, 37) . "'> &#8593; "
586
+			. "<a href='".$self.'#f_'.substr((string) $fonc, 0, 37)."'> &#8593; "
589 587
 			. ($legend ?: $mode)
590 588
 			. '</a></legend>'
591 589
 			. $texte
@@ -597,7 +595,7 @@  discard block
 block discarded – undo
597 595
 
598 596
 function emboite_texte($res, $fonc = '', $self = '') {
599 597
 	$errs = $res->err;
600
-	$texte = $res->entete . ($errs ? '' : $res->page);
598
+	$texte = $res->entete.($errs ? '' : $res->page);
601 599
 
602 600
 	if (!$texte && !$errs) {
603 601
 		return [ancre_texte('', ['', '']), false];
@@ -653,7 +651,7 @@  discard block
 block discarded – undo
653 651
 		$err = "<h2 style='text-align: center'>"
654 652
 			. $i
655 653
 			. "<a href='#fin_err'>"
656
-			. ' ' . _T('erreur_texte')
654
+			. ' '._T('erreur_texte')
657 655
 			. "</a></h2><table id='debut_err' style='width: 100%'>"
658 656
 			. $err
659 657
 			. " </table><a id='fin_err'></a>";
@@ -663,9 +661,9 @@  discard block
 block discarded – undo
663 661
 		[$msg, $fermant, $ouvrant] = $errs[0];
664 662
 		$rf = reference_boucle_debug($fermant, $fonc, $self);
665 663
 		$ro = reference_boucle_debug($ouvrant, $fonc, $self);
666
-		$err = $msg .
667
-			"<a href='#L" . $fermant . "'>$fermant</a>$rf<br />" .
668
-			"<a href='#L" . $ouvrant . "'>$ouvrant</a>$ro";
664
+		$err = $msg.
665
+			"<a href='#L".$fermant."'>$fermant</a>$rf<br />".
666
+			"<a href='#L".$ouvrant."'>$ouvrant</a>$ro";
669 667
 
670 668
 		return [ancre_texte($texte, [[$ouvrant], [$fermant]]), $err];
671 669
 	}
@@ -698,7 +696,7 @@  discard block
 block discarded – undo
698 696
 			['time' => $GLOBALS['debug_objets']['profile'][$sourcefile]]
699 697
 		) : '';
700 698
 
701
-		$res .= "<fieldset id='f_" . $nom . "'><legend>"
699
+		$res .= "<fieldset id='f_".$nom."'><legend>"
702 700
 			. $t_skel
703 701
 			. ' '
704 702
 			. $sourcefile
@@ -713,7 +711,7 @@  discard block
 block discarded – undo
713 711
 			. "'>"
714 712
 			. _T('zbug_calcul')
715 713
 			. '</a></legend>'
716
-			. ($temps ? "\n<span style='display:block;float:" . $GLOBALS['spip_lang_right'] . "'>$temps</span><br />" : (''))
714
+			. ($temps ? "\n<span style='display:block;float:".$GLOBALS['spip_lang_right']."'>$temps</span><br />" : (''))
717 715
 			. debusquer_contexte($contexte[$sourcefile])
718 716
 		. ($nav ? "<table width='100%'>\n$nav</table>\n" : (''))
719 717
 		. "</fieldset>\n";
@@ -734,33 +732,33 @@  discard block
 block discarded – undo
734 732
 			$nom = $boucle->id_boucle;
735 733
 			$req = $boucle->type_requete;
736 734
 			$crit = public_decompiler($boucle, $gram, 0, 'criteres');
737
-			$self2 = $self . '&amp;var_mode_objet=' . $objet;
738
-
739
-			$res .= "\n<tr style='background-color: " .
740
-				($i % 2 ? '#e0e0f0' : '#f8f8ff') .
741
-				"'><td  align='right'>$i</td><td>\n" .
742
-				"<a  class='debug_link_boucle' href='" .
743
-				$self2 .
744
-				"&amp;var_mode_affiche=boucle#f_$nom_skel'>" .
745
-				_T('zbug_boucle') .
746
-				"</a></td><td>\n<a class='debug_link_boucle' href='" .
747
-				$self2 .
748
-				"&amp;var_mode_affiche=resultat#f_$nom_skel'>" .
749
-				_T('zbug_resultat') .
750
-				"</a></td><td>\n<a class='debug_link_resultat' href='" .
751
-				$self2 .
752
-				"&amp;var_mode_affiche=code#f_$nom_skel'>" .
753
-				_T('zbug_code') .
754
-				"</a></td><td>\n<a class='debug_link_resultat' href='" .
755
-				str_replace('var_mode=', 'var_profile=', $self2) .
756
-				"'>" .
757
-				_T('zbug_calcul') .
758
-				"</a></td><td>\n" .
759
-				(($var_mode_objet == $objet) ? "<b>$nom</b>" : $nom) .
760
-				"</td><td>\n" .
761
-				$req .
762
-				"</td><td>\n" .
763
-				spip_htmlspecialchars($crit) .
735
+			$self2 = $self.'&amp;var_mode_objet='.$objet;
736
+
737
+			$res .= "\n<tr style='background-color: ".
738
+				($i % 2 ? '#e0e0f0' : '#f8f8ff').
739
+				"'><td  align='right'>$i</td><td>\n".
740
+				"<a  class='debug_link_boucle' href='".
741
+				$self2.
742
+				"&amp;var_mode_affiche=boucle#f_$nom_skel'>".
743
+				_T('zbug_boucle').
744
+				"</a></td><td>\n<a class='debug_link_boucle' href='".
745
+				$self2.
746
+				"&amp;var_mode_affiche=resultat#f_$nom_skel'>".
747
+				_T('zbug_resultat').
748
+				"</a></td><td>\n<a class='debug_link_resultat' href='".
749
+				$self2.
750
+				"&amp;var_mode_affiche=code#f_$nom_skel'>".
751
+				_T('zbug_code').
752
+				"</a></td><td>\n<a class='debug_link_resultat' href='".
753
+				str_replace('var_mode=', 'var_profile=', $self2).
754
+				"'>".
755
+				_T('zbug_calcul').
756
+				"</a></td><td>\n".
757
+				(($var_mode_objet == $objet) ? "<b>$nom</b>" : $nom).
758
+				"</td><td>\n".
759
+				$req.
760
+				"</td><td>\n".
761
+				spip_htmlspecialchars($crit).
764 762
 				'</td></tr>';
765 763
 		}
766 764
 	}
@@ -787,7 +785,7 @@  discard block
 block discarded – undo
787 785
 		}
788 786
 		//  permettre le copier/coller facile
789 787
 		// $res = ancre_texte($req, array(), true);
790
-		$res = "<div id='T" . md5((string) $req) . "'>\n<pre>\n" . $req . "</pre>\n</div>\n";
788
+		$res = "<div id='T".md5((string) $req)."'>\n<pre>\n".$req."</pre>\n</div>\n";
791 789
 		//  formatage et affichage des resultats bruts de la requete
792 790
 		$ress_req = spip_query($req);
793 791
 		$brut_sql = '';
@@ -797,10 +795,10 @@  discard block
 block discarded – undo
797 795
 		$max_aff = defined('_MAX_DEBUG_AFF') ? _MAX_DEBUG_AFF : 50;
798 796
 		while ($retours_sql = sql_fetch($ress_req)) {
799 797
 			if ($num <= $max_aff) {
800
-				$brut_sql .= '<h3>' . ($num == 1 ? $num . ' sur ' . sql_count($ress_req) : $num) . '</h3>';
798
+				$brut_sql .= '<h3>'.($num == 1 ? $num.' sur '.sql_count($ress_req) : $num).'</h3>';
801 799
 				$brut_sql .= '<p>';
802 800
 				foreach ($retours_sql as $key => $val) {
803
-					$brut_sql .= '<strong>' . $key . '</strong> => ' . spip_htmlspecialchars(couper($val, 150)) . "<br />\n";
801
+					$brut_sql .= '<strong>'.$key.'</strong> => '.spip_htmlspecialchars(couper($val, 150))."<br />\n";
804 802
 				}
805 803
 				$brut_sql .= '</p>';
806 804
 			}
@@ -811,14 +809,14 @@  discard block
 block discarded – undo
811 809
 			//  ne pas afficher les $contexte_inclus
812 810
 			$view = preg_replace(',<\?php.+\?[>],Uims', '', (string) $view);
813 811
 			if ($view) {
814
-				$res2 .= "\n<br /><fieldset>" . interdire_scripts($view) . '</fieldset>';
812
+				$res2 .= "\n<br /><fieldset>".interdire_scripts($view).'</fieldset>';
815 813
 			}
816 814
 		}
817 815
 	} elseif ($affiche == 'code') {
818 816
 		$legend = $nom;
819
-		$res = ancre_texte('<' . "?php\n" . $quoi . "\n?" . '>');
817
+		$res = ancre_texte('<'."?php\n".$quoi."\n?".'>');
820 818
 	} elseif ($affiche == 'boucle') {
821
-		$legend = _T('zbug_boucle') . ' ' . $nom;
819
+		$legend = _T('zbug_boucle').' '.$nom;
822 820
 		// Le compilateur prefixe le nom des boucles par l'extension du fichier source.
823 821
 		$gram = preg_match('/^([^_]+)_/', (string) $objet, $r) ? $r[1] : '';
824 822
 		$res = ancre_texte(public_decompiler($quoi, $gram, 0, 'boucle'));
@@ -836,23 +834,23 @@  discard block
 block discarded – undo
836 834
 	include_spip('public/assembler'); // pour inclure_balise_dynamique
837 835
 	include_spip('inc/texte'); // pour corriger_typo
838 836
 
839
-	return _DOCTYPE_ECRIRE .
840
-	html_lang_attributes() .
841
-	"<head>\n<title>" .
842
-	('SPIP ' . $GLOBALS['spip_version_affichee'] . ' ' .
843
-		_T('admin_debug') . ' ' . spip_htmlspecialchars($titre) . ' (' .
844
-		supprimer_tags(corriger_typo($GLOBALS['meta']['nom_site']))) .
845
-	")</title>\n" .
846
-	"<meta http-equiv='Content-Type' content='text/html" .
847
-	(($c = $GLOBALS['meta']['charset']) ? "; charset=$c" : '') .
848
-	"' />\n" .
837
+	return _DOCTYPE_ECRIRE.
838
+	html_lang_attributes().
839
+	"<head>\n<title>".
840
+	('SPIP '.$GLOBALS['spip_version_affichee'].' '.
841
+		_T('admin_debug').' '.spip_htmlspecialchars($titre).' ('.
842
+		supprimer_tags(corriger_typo($GLOBALS['meta']['nom_site']))).
843
+	")</title>\n".
844
+	"<meta http-equiv='Content-Type' content='text/html".
845
+	(($c = $GLOBALS['meta']['charset']) ? "; charset=$c" : '').
846
+	"' />\n".
849 847
 	http_script('', 'jquery.js')
850
-	. "<link rel='stylesheet' href='" . url_absolue(find_in_path('spip_admin.css'))
851
-	. "' type='text/css' />" .
852
-	"</head>\n" .
853
-	"<body style='margin:0 10px;'>\n" .
854
-	"<div id='spip-debug-header'>" .
855
-	$corps .
856
-	inclure_balise_dynamique(balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $GLOBALS['debug_objets']), false) .
848
+	. "<link rel='stylesheet' href='".url_absolue(find_in_path('spip_admin.css'))
849
+	. "' type='text/css' />".
850
+	"</head>\n".
851
+	"<body style='margin:0 10px;'>\n".
852
+	"<div id='spip-debug-header'>".
853
+	$corps.
854
+	inclure_balise_dynamique(balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $GLOBALS['debug_objets']), false).
857 855
 	'</div></body></html>';
858 856
 }
Please login to merge, or discard this patch.
ecrire/public/composer.php 1 patch
Indentation   +765 added lines, -765 removed lines patch added patch discarded remove patch
@@ -19,7 +19,7 @@  discard block
 block discarded – undo
19 19
  **/
20 20
 
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 
25 25
 include_spip('inc/texte');
@@ -42,229 +42,229 @@  discard block
 block discarded – undo
42 42
 
43 43
 function public_composer_dist($squelette, $mime_type, $gram, $source, string $connect = '') {
44 44
 
45
-	$skel = null;
46
-	$boucle = null;
47
-	$nom = calculer_nom_fonction_squel($squelette, $mime_type, $connect);
48
-
49
-	//  si deja en memoire (INCLURE  a repetition) c'est bon.
50
-	if (function_exists($nom)) {
51
-		return $nom;
52
-	}
53
-
54
-	if (defined('_VAR_MODE') && _VAR_MODE == 'debug') {
55
-		$GLOBALS['debug_objets']['courant'] = $nom;
56
-	}
57
-
58
-	$phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php';
59
-
60
-	// si squelette est deja compile et perenne, le charger
61
-	if (!squelette_obsolete($phpfile, $source)) {
62
-		include_once $phpfile;
63
-		#if (!squelette_obsolete($phpfile, $source)
64
-		#  AND lire_fichier ($phpfile, $skel_code,
65
-		#  array('critique' => 'oui', 'phpcheck' => 'oui'))){
66
-		## eval('?'.'>'.$skel_code);
67
-		#	 spip_logger('comp')->info($skel_code);
68
-		#}
69
-	}
70
-
71
-	if (file_exists($lib = $squelette . '_fonctions' . '.php')) {
72
-		include_once $lib;
73
-	}
74
-
75
-	// tester si le eval ci-dessus a mis le squelette en memoire
76
-
77
-	if (function_exists($nom)) {
78
-		return $nom;
79
-	}
80
-
81
-	// charger le source, si possible, et compiler
82
-	$skel_code = '';
83
-	if (lire_fichier($source, $skel)) {
84
-		$compiler = charger_fonction('compiler', 'public');
85
-		$skel_code = $compiler($skel, $nom, $gram, $source, $connect);
86
-	}
87
-
88
-	// Ne plus rien faire si le compilateur n'a pas pu operer.
89
-	if (!$skel_code) {
90
-		return false;
91
-	}
92
-
93
-	foreach ($skel_code as $id => $boucle) {
94
-		$f = $boucle->return;
95
-		try {
96
-			eval("return true; $f ;");
97
-		} catch (\ParseError $e) {
98
-			// Code syntaxiquement faux (critere etc mal programme')
99
-			$msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage();
100
-			erreur_squelette($msg, $boucle);
101
-			// continuer pour trouver d'autres fautes eventuelles
102
-			// mais prevenir que c'est mort
103
-			$nom = '';
104
-		}
105
-
106
-		// contexte de compil inutile a present
107
-		// (mais la derniere valeur de $boucle est utilisee ci-dessous)
108
-		$skel_code[$id] = $f;
109
-	}
110
-
111
-	$code = '';
112
-	if ($nom) {
113
-		// Si le code est bon, concatener et mettre en cache
114
-		if (function_exists($nom)) {
115
-			$code = squelette_traduit($skel, $source, $phpfile, $skel_code);
116
-		} else {
117
-			// code semantiquement faux: bug du compilateur
118
-			// $boucle est en fait ici la fct principale du squelette
119
-			$msg = _T('zbug_erreur_compilation');
120
-			erreur_squelette($msg, $boucle);
121
-			$nom = '';
122
-		}
123
-	}
124
-
125
-	if (defined('_VAR_MODE') && _VAR_MODE == 'debug') {
126
-		// Tracer ce qui vient d'etre compile
127
-		$GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code;
128
-
129
-		// si c'est ce que demande le debusqueur, lui passer la main
130
-		if (
131
-			$GLOBALS['debug_objets']['sourcefile']
132
-			&& _request('var_mode_objet') == $nom
133
-			&& _request('var_mode_affiche') == 'code'
134
-		) {
135
-			erreur_squelette();
136
-		}
137
-	}
138
-
139
-	return $nom ?: false;
45
+    $skel = null;
46
+    $boucle = null;
47
+    $nom = calculer_nom_fonction_squel($squelette, $mime_type, $connect);
48
+
49
+    //  si deja en memoire (INCLURE  a repetition) c'est bon.
50
+    if (function_exists($nom)) {
51
+        return $nom;
52
+    }
53
+
54
+    if (defined('_VAR_MODE') && _VAR_MODE == 'debug') {
55
+        $GLOBALS['debug_objets']['courant'] = $nom;
56
+    }
57
+
58
+    $phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php';
59
+
60
+    // si squelette est deja compile et perenne, le charger
61
+    if (!squelette_obsolete($phpfile, $source)) {
62
+        include_once $phpfile;
63
+        #if (!squelette_obsolete($phpfile, $source)
64
+        #  AND lire_fichier ($phpfile, $skel_code,
65
+        #  array('critique' => 'oui', 'phpcheck' => 'oui'))){
66
+        ## eval('?'.'>'.$skel_code);
67
+        #	 spip_logger('comp')->info($skel_code);
68
+        #}
69
+    }
70
+
71
+    if (file_exists($lib = $squelette . '_fonctions' . '.php')) {
72
+        include_once $lib;
73
+    }
74
+
75
+    // tester si le eval ci-dessus a mis le squelette en memoire
76
+
77
+    if (function_exists($nom)) {
78
+        return $nom;
79
+    }
80
+
81
+    // charger le source, si possible, et compiler
82
+    $skel_code = '';
83
+    if (lire_fichier($source, $skel)) {
84
+        $compiler = charger_fonction('compiler', 'public');
85
+        $skel_code = $compiler($skel, $nom, $gram, $source, $connect);
86
+    }
87
+
88
+    // Ne plus rien faire si le compilateur n'a pas pu operer.
89
+    if (!$skel_code) {
90
+        return false;
91
+    }
92
+
93
+    foreach ($skel_code as $id => $boucle) {
94
+        $f = $boucle->return;
95
+        try {
96
+            eval("return true; $f ;");
97
+        } catch (\ParseError $e) {
98
+            // Code syntaxiquement faux (critere etc mal programme')
99
+            $msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage();
100
+            erreur_squelette($msg, $boucle);
101
+            // continuer pour trouver d'autres fautes eventuelles
102
+            // mais prevenir que c'est mort
103
+            $nom = '';
104
+        }
105
+
106
+        // contexte de compil inutile a present
107
+        // (mais la derniere valeur de $boucle est utilisee ci-dessous)
108
+        $skel_code[$id] = $f;
109
+    }
110
+
111
+    $code = '';
112
+    if ($nom) {
113
+        // Si le code est bon, concatener et mettre en cache
114
+        if (function_exists($nom)) {
115
+            $code = squelette_traduit($skel, $source, $phpfile, $skel_code);
116
+        } else {
117
+            // code semantiquement faux: bug du compilateur
118
+            // $boucle est en fait ici la fct principale du squelette
119
+            $msg = _T('zbug_erreur_compilation');
120
+            erreur_squelette($msg, $boucle);
121
+            $nom = '';
122
+        }
123
+    }
124
+
125
+    if (defined('_VAR_MODE') && _VAR_MODE == 'debug') {
126
+        // Tracer ce qui vient d'etre compile
127
+        $GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code;
128
+
129
+        // si c'est ce que demande le debusqueur, lui passer la main
130
+        if (
131
+            $GLOBALS['debug_objets']['sourcefile']
132
+            && _request('var_mode_objet') == $nom
133
+            && _request('var_mode_affiche') == 'code'
134
+        ) {
135
+            erreur_squelette();
136
+        }
137
+    }
138
+
139
+    return $nom ?: false;
140 140
 }
141 141
 
142 142
 function squelette_traduit($squelette, $sourcefile, $phpfile, $boucles) {
143 143
 
144
-	$code = null;
145
-	// Le dernier index est '' (fonction principale)
146
-	$noms = substr(join(', ', array_keys($boucles)), 0, -2);
147
-	if (CODE_COMMENTE) {
148
-		$code = "
144
+    $code = null;
145
+    // Le dernier index est '' (fonction principale)
146
+    $noms = substr(join(', ', array_keys($boucles)), 0, -2);
147
+    if (CODE_COMMENTE) {
148
+        $code = "
149 149
 /*
150 150
  * Squelette : $sourcefile
151 151
  * Date :      " . gmdate('D, d M Y H:i:s', @filemtime($sourcefile)) . ' GMT
152 152
  * Compile :   ' . gmdate('D, d M Y H:i:s', time()) . ' GMT
153 153
  * ' . (!$boucles ? 'Pas de boucle' : ('Boucles :   ' . $noms)) . '
154 154
  */ ';
155
-	}
155
+    }
156 156
 
157
-	$code = '<' . "?php\n" . $code . join('', $boucles) . "\n";
158
-	if (!defined('_VAR_NOCACHE') || !_VAR_NOCACHE) {
159
-		ecrire_fichier($phpfile, $code);
160
-	}
157
+    $code = '<' . "?php\n" . $code . join('', $boucles) . "\n";
158
+    if (!defined('_VAR_NOCACHE') || !_VAR_NOCACHE) {
159
+        ecrire_fichier($phpfile, $code);
160
+    }
161 161
 
162
-	return $code;
162
+    return $code;
163 163
 }
164 164
 
165 165
 // Le squelette compile est-il trop vieux ?
166 166
 function squelette_obsolete($skel, $squelette) {
167
-	static $date_change = null;
168
-	// ne verifier la date de mes_fonctions et mes_options qu'une seule fois
169
-	// par hit
170
-	if (is_null($date_change)) {
171
-		if (@file_exists($fonc = 'mes_fonctions.php')) {
172
-			$date_change = @filemtime($fonc);
173
-		} # compatibilite
174
-		if (defined('_FILE_OPTIONS')) {
175
-			$date_change = max($date_change, @filemtime(_FILE_OPTIONS));
176
-		}
177
-	}
178
-
179
-	return (
180
-		defined('_VAR_MODE') && in_array(_VAR_MODE, ['recalcul', 'preview', 'debug'])
181
-		|| !@file_exists($skel)
182
-		|| (@file_exists($squelette) ? @filemtime($squelette) : 0) > ($date = @filemtime($skel))
183
-		|| $date_change > $date
184
-	);
167
+    static $date_change = null;
168
+    // ne verifier la date de mes_fonctions et mes_options qu'une seule fois
169
+    // par hit
170
+    if (is_null($date_change)) {
171
+        if (@file_exists($fonc = 'mes_fonctions.php')) {
172
+            $date_change = @filemtime($fonc);
173
+        } # compatibilite
174
+        if (defined('_FILE_OPTIONS')) {
175
+            $date_change = max($date_change, @filemtime(_FILE_OPTIONS));
176
+        }
177
+    }
178
+
179
+    return (
180
+        defined('_VAR_MODE') && in_array(_VAR_MODE, ['recalcul', 'preview', 'debug'])
181
+        || !@file_exists($skel)
182
+        || (@file_exists($squelette) ? @filemtime($squelette) : 0) > ($date = @filemtime($skel))
183
+        || $date_change > $date
184
+    );
185 185
 }
186 186
 
187 187
 // Activer l'invalideur de session
188 188
 function invalideur_session(&$Cache, $code = null) {
189
-	$Cache['session'] = spip_session();
189
+    $Cache['session'] = spip_session();
190 190
 
191
-	return $code;
191
+    return $code;
192 192
 }
193 193
 
194 194
 
195 195
 function analyse_resultat_skel($nom, $cache, $corps, $source = '') {
196
-	static $filtres = [];
197
-	$headers = [];
198
-	$corps ??= '';
199
-
200
-	// Recupere les < ?php header('Xx: y'); ? > pour $page['headers']
201
-	// note: on essaie d'attrapper aussi certains de ces entetes codes
202
-	// "a la main" dans les squelettes, mais evidemment sans exhaustivite
203
-	if (
204
-		stripos($corps, 'header') !== false
205
-		&& preg_match_all(
206
-			'/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims',
207
-			$corps,
208
-			$regs,
209
-			PREG_SET_ORDER
210
-		)
211
-	) {
212
-		foreach ($regs as $r) {
213
-			$corps = str_replace($r[0], '', $corps);
214
-			# $j = Content-Type, et pas content-TYPE.
215
-			$j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
216
-
217
-			if ($j == 'X-Spip-Filtre' && isset($headers[$j])) {
218
-				$headers[$j] .= '|' . $r[3];
219
-			} else {
220
-				$headers[$j] = str_replace(['\\\\',"\\'",'\\"'], ['\\',"'",'"'], $r[3]);
221
-			}
222
-		}
223
-	}
224
-	// S'agit-il d'un resultat constant ou contenant du code php
225
-	$process_ins = (
226
-		!str_contains($corps, '<' . '?')
227
-		|| str_contains($corps, '<' . '?xml') && !str_contains(str_replace('<' . '?xml', '', $corps), '<' . '?')
228
-	)
229
-		? 'html'
230
-		: 'php';
231
-
232
-	$skel = [
233
-		'squelette' => $nom,
234
-		'source' => $source,
235
-		'process_ins' => $process_ins,
236
-		'invalideurs' => $cache,
237
-		'entetes' => $headers,
238
-		'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0
239
-	];
240
-
241
-	// traiter #FILTRE{} et filtres
242
-	if (!isset($filtres[$nom])) {
243
-		$filtres[$nom] = pipeline('declarer_filtres_squelettes', ['args' => $skel, 'data' => []]);
244
-	}
245
-	$filtres_headers = [];
246
-	if (isset($headers['X-Spip-Filtre']) && strlen($headers['X-Spip-Filtre'])) {
247
-		$filtres_headers = array_filter(explode('|', $headers['X-Spip-Filtre']));
248
-		unset($headers['X-Spip-Filtre']);
249
-	}
250
-	if ((is_countable($filtres[$nom]) ? count($filtres[$nom]) : 0) || count($filtres_headers)) {
251
-		include_spip('public/sandbox');
252
-		$corps = sandbox_filtrer_squelette($skel, $corps, $filtres_headers, $filtres[$nom]);
253
-
254
-		if ($process_ins == 'html') {
255
-			$skel['process_ins'] = (
256
-				!str_contains($corps, '<' . '?')
257
-				|| str_contains($corps, '<' . '?xml') && !str_contains(str_replace('<' . '?xml', '', $corps), '<' . '?')
258
-			)
259
-				? 'html'
260
-				: 'php';
261
-		}
262
-	}
263
-
264
-	$skel['entetes'] = $headers;
265
-	$skel['texte'] = $corps;
266
-
267
-	return $skel;
196
+    static $filtres = [];
197
+    $headers = [];
198
+    $corps ??= '';
199
+
200
+    // Recupere les < ?php header('Xx: y'); ? > pour $page['headers']
201
+    // note: on essaie d'attrapper aussi certains de ces entetes codes
202
+    // "a la main" dans les squelettes, mais evidemment sans exhaustivite
203
+    if (
204
+        stripos($corps, 'header') !== false
205
+        && preg_match_all(
206
+            '/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims',
207
+            $corps,
208
+            $regs,
209
+            PREG_SET_ORDER
210
+        )
211
+    ) {
212
+        foreach ($regs as $r) {
213
+            $corps = str_replace($r[0], '', $corps);
214
+            # $j = Content-Type, et pas content-TYPE.
215
+            $j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
216
+
217
+            if ($j == 'X-Spip-Filtre' && isset($headers[$j])) {
218
+                $headers[$j] .= '|' . $r[3];
219
+            } else {
220
+                $headers[$j] = str_replace(['\\\\',"\\'",'\\"'], ['\\',"'",'"'], $r[3]);
221
+            }
222
+        }
223
+    }
224
+    // S'agit-il d'un resultat constant ou contenant du code php
225
+    $process_ins = (
226
+        !str_contains($corps, '<' . '?')
227
+        || str_contains($corps, '<' . '?xml') && !str_contains(str_replace('<' . '?xml', '', $corps), '<' . '?')
228
+    )
229
+        ? 'html'
230
+        : 'php';
231
+
232
+    $skel = [
233
+        'squelette' => $nom,
234
+        'source' => $source,
235
+        'process_ins' => $process_ins,
236
+        'invalideurs' => $cache,
237
+        'entetes' => $headers,
238
+        'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0
239
+    ];
240
+
241
+    // traiter #FILTRE{} et filtres
242
+    if (!isset($filtres[$nom])) {
243
+        $filtres[$nom] = pipeline('declarer_filtres_squelettes', ['args' => $skel, 'data' => []]);
244
+    }
245
+    $filtres_headers = [];
246
+    if (isset($headers['X-Spip-Filtre']) && strlen($headers['X-Spip-Filtre'])) {
247
+        $filtres_headers = array_filter(explode('|', $headers['X-Spip-Filtre']));
248
+        unset($headers['X-Spip-Filtre']);
249
+    }
250
+    if ((is_countable($filtres[$nom]) ? count($filtres[$nom]) : 0) || count($filtres_headers)) {
251
+        include_spip('public/sandbox');
252
+        $corps = sandbox_filtrer_squelette($skel, $corps, $filtres_headers, $filtres[$nom]);
253
+
254
+        if ($process_ins == 'html') {
255
+            $skel['process_ins'] = (
256
+                !str_contains($corps, '<' . '?')
257
+                || str_contains($corps, '<' . '?xml') && !str_contains(str_replace('<' . '?xml', '', $corps), '<' . '?')
258
+            )
259
+                ? 'html'
260
+                : 'php';
261
+        }
262
+    }
263
+
264
+    $skel['entetes'] = $headers;
265
+    $skel['texte'] = $corps;
266
+
267
+    return $skel;
268 268
 }
269 269
 
270 270
 //
@@ -278,7 +278,7 @@  discard block
 block discarded – undo
278 278
 inserer_balise_dynamique(balise_%s_dyn(%s), array(%s));
279 279
 if ($lang_select) lang_select();
280 280
 ?'
281
-	. '>');
281
+    . '>');
282 282
 
283 283
 /**
284 284
  * Synthétise une balise dynamique : crée l'appel à l'inclusion
@@ -298,35 +298,35 @@  discard block
 block discarded – undo
298 298
  *     Code PHP pour inclure le squelette de la balise dynamique
299 299
  **/
300 300
 function synthetiser_balise_dynamique($nom, $args, $file, $context_compil) {
301
-	if (
302
-		!str_starts_with($file, '/')
303
-		// pas de lien symbolique sous Windows
304
-		&& !(stristr(PHP_OS, 'WIN') && str_contains($file, ':'))
305
-	) {
306
-		$file = './" . _DIR_RACINE . "' . $file;
307
-	}
308
-
309
-	$lang = $context_compil[4];
310
-	if (preg_match(',\W,', $lang)) {
311
-		$lang = '';
312
-	}
313
-
314
-	$args = array_map('argumenter_squelette', $args);
315
-	if (!empty($context_compil['appel_php_depuis_modele'])) {
316
-		$args[0] = 'arguments_balise_dyn_depuis_modele(' . $args[0] . ')';
317
-	}
318
-	$args = join(', ', $args);
319
-
320
-	$r = sprintf(
321
-		CODE_INCLURE_BALISE,
322
-		$file,
323
-		$lang,
324
-		$nom,
325
-		$args,
326
-		join(', ', array_map('_q', $context_compil))
327
-	);
328
-
329
-	return $r;
301
+    if (
302
+        !str_starts_with($file, '/')
303
+        // pas de lien symbolique sous Windows
304
+        && !(stristr(PHP_OS, 'WIN') && str_contains($file, ':'))
305
+    ) {
306
+        $file = './" . _DIR_RACINE . "' . $file;
307
+    }
308
+
309
+    $lang = $context_compil[4];
310
+    if (preg_match(',\W,', $lang)) {
311
+        $lang = '';
312
+    }
313
+
314
+    $args = array_map('argumenter_squelette', $args);
315
+    if (!empty($context_compil['appel_php_depuis_modele'])) {
316
+        $args[0] = 'arguments_balise_dyn_depuis_modele(' . $args[0] . ')';
317
+    }
318
+    $args = join(', ', $args);
319
+
320
+    $r = sprintf(
321
+        CODE_INCLURE_BALISE,
322
+        $file,
323
+        $lang,
324
+        $nom,
325
+        $args,
326
+        join(', ', array_map('_q', $context_compil))
327
+    );
328
+
329
+    return $r;
330 330
 }
331 331
 
332 332
 /**
@@ -344,18 +344,18 @@  discard block
 block discarded – undo
344 344
  **/
345 345
 function argumenter_squelette($v) {
346 346
 
347
-	if (is_object($v)) {
348
-		return var_export($v, true);
349
-	} elseif (!is_array($v)) {
350
-		return "'" . texte_script((string) $v) . "'";
351
-	} else {
352
-		$out = [];
353
-		foreach ($v as $k => $val) {
354
-			$out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val);
355
-		}
356
-
357
-		return 'array(' . join(', ', $out) . ')';
358
-	}
347
+    if (is_object($v)) {
348
+        return var_export($v, true);
349
+    } elseif (!is_array($v)) {
350
+        return "'" . texte_script((string) $v) . "'";
351
+    } else {
352
+        $out = [];
353
+        foreach ($v as $k => $val) {
354
+            $out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val);
355
+        }
356
+
357
+        return 'array(' . join(', ', $out) . ')';
358
+    }
359 359
 }
360 360
 
361 361
 /**
@@ -374,13 +374,13 @@  discard block
 block discarded – undo
374 374
  * @return string
375 375
  */
376 376
 function executer_balise_dynamique_dans_un_modele(...$args) {
377
-	if (test_espace_prive()) {
378
-		return executer_balise_dynamique(...$args);
379
-	}
380
-	else {
381
-		$str_args = base64_encode(serialize($args));
382
-		return '<?' . "php \$_zargs=unserialize(base64_decode('$str_args'));echo executer_balise_dynamique(...\$_zargs); ?" . ">\n";
383
-	}
377
+    if (test_espace_prive()) {
378
+        return executer_balise_dynamique(...$args);
379
+    }
380
+    else {
381
+        $str_args = base64_encode(serialize($args));
382
+        return '<?' . "php \$_zargs=unserialize(base64_decode('$str_args'));echo executer_balise_dynamique(...\$_zargs); ?" . ">\n";
383
+    }
384 384
 }
385 385
 
386 386
 
@@ -411,87 +411,87 @@  discard block
 block discarded – undo
411 411
  *     Code PHP d'exécutant l'inclusion du squelette (ou texte) de la balise dynamique
412 412
  **/
413 413
 function executer_balise_dynamique($nom, $args, $context_compil) {
414
-	/** @var string Nom de la balise à charger (balise demandée ou balise générique) */
415
-	$nom_balise = $nom;
416
-	/** @var string Nom de la balise générique (si utilisée) */
417
-	$nom_balise_generique = '';
418
-
419
-	$appel_php_depuis_modele = false;
420
-	if (
421
-		is_array($context_compil)
422
-		&& !is_numeric($context_compil[3])
423
-		&& empty($context_compil[0])
424
-		&& empty($context_compil[1])
425
-		&& empty($context_compil[2])
426
-		&& empty($context_compil[3])
427
-	) {
428
-		$appel_php_depuis_modele = true;
429
-	}
430
-
431
-	if (!$fonction_balise = charger_fonction($nom_balise, 'balise', true)) {
432
-		// Calculer un nom générique (ie. 'formulaire_' dans 'formulaire_editer_article')
433
-		if ($balise_generique = chercher_balise_generique($nom)) {
434
-			// injecter en premier arg le nom de la balise
435
-			array_unshift($args, $nom);
436
-			$nom_balise_generique = $balise_generique['nom_generique'];
437
-			$fonction_balise = $balise_generique['fonction_generique'];
438
-			$nom_balise = $nom_balise_generique;
439
-		}
440
-		unset($balise_generique);
441
-	}
442
-
443
-	if (!$fonction_balise) {
444
-		$msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]];
445
-		erreur_squelette($msg, $context_compil);
446
-
447
-		return '';
448
-	}
449
-
450
-	// retrouver le fichier qui a déclaré la fonction
451
-	// même si la fonction dynamique est déclarée dans un fichier de fonctions.
452
-	// Attention sous windows, getFileName() retourne un antislash.
453
-	$reflector = new ReflectionFunction($fonction_balise);
454
-	$file = $reflector->getFileName();
455
-	if (str_starts_with($file, _ROOT_RACINE)) {
456
-		$file = str_replace(\DIRECTORY_SEPARATOR, '/', substr($file, strlen(_ROOT_RACINE)));
457
-	}
458
-
459
-	// Y a-t-il une fonction de traitement des arguments ?
460
-	$f = 'balise_' . $nom_balise . '_stat';
461
-
462
-	$r = !function_exists($f) ? $args : $f($args, $context_compil);
463
-
464
-	if (!is_array($r)) {
465
-		return $r;
466
-	}
467
-
468
-	// verifier que la fonction dyn est la,
469
-	// sinon se replier sur la generique si elle existe
470
-	if (!function_exists('balise_' . $nom_balise . '_dyn')) {
471
-		if (
472
-			($balise_generique = chercher_balise_generique($nom))
473
-			&& ($nom_balise_generique = $balise_generique['nom_generique'])
474
-			&& ($file = include_spip('balise/' . strtolower($nom_balise_generique)))
475
-			&& function_exists('balise_' . $nom_balise_generique . '_dyn')
476
-		) {
477
-			// et lui injecter en premier arg le nom de la balise
478
-			array_unshift($r, $nom);
479
-			$nom_balise = $nom_balise_generique;
480
-			if (!_DIR_RESTREINT) {
481
-				$file = _DIR_RESTREINT_ABS . $file;
482
-			}
483
-		} else {
484
-			$msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]];
485
-			erreur_squelette($msg, $context_compil);
486
-
487
-			return '';
488
-		}
489
-	}
490
-
491
-	if ($appel_php_depuis_modele) {
492
-		$context_compil['appel_php_depuis_modele'] = true;
493
-	}
494
-	return synthetiser_balise_dynamique($nom_balise, $r, $file, $context_compil);
414
+    /** @var string Nom de la balise à charger (balise demandée ou balise générique) */
415
+    $nom_balise = $nom;
416
+    /** @var string Nom de la balise générique (si utilisée) */
417
+    $nom_balise_generique = '';
418
+
419
+    $appel_php_depuis_modele = false;
420
+    if (
421
+        is_array($context_compil)
422
+        && !is_numeric($context_compil[3])
423
+        && empty($context_compil[0])
424
+        && empty($context_compil[1])
425
+        && empty($context_compil[2])
426
+        && empty($context_compil[3])
427
+    ) {
428
+        $appel_php_depuis_modele = true;
429
+    }
430
+
431
+    if (!$fonction_balise = charger_fonction($nom_balise, 'balise', true)) {
432
+        // Calculer un nom générique (ie. 'formulaire_' dans 'formulaire_editer_article')
433
+        if ($balise_generique = chercher_balise_generique($nom)) {
434
+            // injecter en premier arg le nom de la balise
435
+            array_unshift($args, $nom);
436
+            $nom_balise_generique = $balise_generique['nom_generique'];
437
+            $fonction_balise = $balise_generique['fonction_generique'];
438
+            $nom_balise = $nom_balise_generique;
439
+        }
440
+        unset($balise_generique);
441
+    }
442
+
443
+    if (!$fonction_balise) {
444
+        $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]];
445
+        erreur_squelette($msg, $context_compil);
446
+
447
+        return '';
448
+    }
449
+
450
+    // retrouver le fichier qui a déclaré la fonction
451
+    // même si la fonction dynamique est déclarée dans un fichier de fonctions.
452
+    // Attention sous windows, getFileName() retourne un antislash.
453
+    $reflector = new ReflectionFunction($fonction_balise);
454
+    $file = $reflector->getFileName();
455
+    if (str_starts_with($file, _ROOT_RACINE)) {
456
+        $file = str_replace(\DIRECTORY_SEPARATOR, '/', substr($file, strlen(_ROOT_RACINE)));
457
+    }
458
+
459
+    // Y a-t-il une fonction de traitement des arguments ?
460
+    $f = 'balise_' . $nom_balise . '_stat';
461
+
462
+    $r = !function_exists($f) ? $args : $f($args, $context_compil);
463
+
464
+    if (!is_array($r)) {
465
+        return $r;
466
+    }
467
+
468
+    // verifier que la fonction dyn est la,
469
+    // sinon se replier sur la generique si elle existe
470
+    if (!function_exists('balise_' . $nom_balise . '_dyn')) {
471
+        if (
472
+            ($balise_generique = chercher_balise_generique($nom))
473
+            && ($nom_balise_generique = $balise_generique['nom_generique'])
474
+            && ($file = include_spip('balise/' . strtolower($nom_balise_generique)))
475
+            && function_exists('balise_' . $nom_balise_generique . '_dyn')
476
+        ) {
477
+            // et lui injecter en premier arg le nom de la balise
478
+            array_unshift($r, $nom);
479
+            $nom_balise = $nom_balise_generique;
480
+            if (!_DIR_RESTREINT) {
481
+                $file = _DIR_RESTREINT_ABS . $file;
482
+            }
483
+        } else {
484
+            $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]];
485
+            erreur_squelette($msg, $context_compil);
486
+
487
+            return '';
488
+        }
489
+    }
490
+
491
+    if ($appel_php_depuis_modele) {
492
+        $context_compil['appel_php_depuis_modele'] = true;
493
+    }
494
+    return synthetiser_balise_dynamique($nom_balise, $r, $file, $context_compil);
495 495
 }
496 496
 
497 497
 /**
@@ -506,23 +506,23 @@  discard block
 block discarded – undo
506 506
  * @return array|null
507 507
  */
508 508
 function chercher_balise_generique($nom) {
509
-	if (!str_contains($nom, '_')) {
510
-		return null;
511
-	}
512
-	$nom_generique = $nom;
513
-	while (false !== ($p = strrpos($nom_generique, '_'))) {
514
-		$nom_generique = substr($nom_generique, 0, $p + 1);
515
-		$fonction_generique = charger_fonction($nom_generique, 'balise', true);
516
-		if ($fonction_generique) {
517
-			return [
518
-				'nom' => $nom,
519
-				'nom_generique' => $nom_generique,
520
-				'fonction_generique' => $fonction_generique,
521
-			];
522
-		}
523
-		$nom_generique = substr($nom_generique, 0, -1);
524
-	}
525
-	return null;
509
+    if (!str_contains($nom, '_')) {
510
+        return null;
511
+    }
512
+    $nom_generique = $nom;
513
+    while (false !== ($p = strrpos($nom_generique, '_'))) {
514
+        $nom_generique = substr($nom_generique, 0, $p + 1);
515
+        $fonction_generique = charger_fonction($nom_generique, 'balise', true);
516
+        if ($fonction_generique) {
517
+            return [
518
+                'nom' => $nom,
519
+                'nom_generique' => $nom_generique,
520
+                'fonction_generique' => $fonction_generique,
521
+            ];
522
+        }
523
+        $nom_generique = substr($nom_generique, 0, -1);
524
+    }
525
+    return null;
526 526
 }
527 527
 
528 528
 
@@ -546,51 +546,51 @@  discard block
 block discarded – undo
546 546
  * @return null;
547 547
  **/
548 548
 function lang_select_public($lang, $lang_select, $titre = null) {
549
-	// Cas 1. forcer_lang = true et pas de critere {lang_select}
550
-	if (
551
-		isset($GLOBALS['forcer_lang'])
552
-		&& $GLOBALS['forcer_lang']
553
-		&& $lang_select !== 'oui'
554
-	) {
555
-		$lang = $GLOBALS['spip_lang'];
556
-	} // Cas 2. l'objet n'a pas de langue definie (ou definie a '')
557
-	elseif (!strlen($lang)) {
558
-		$lang = $GLOBALS['spip_lang'];
559
-	} // Cas 3. l'objet est multilingue !
560
-	elseif (
561
-		$lang_select !== 'oui'
562
-		&& strlen($titre) > 10
563
-		&& str_contains($titre, '<multi>')
564
-		&& str_contains(CollecteurHtmlTag::proteger_balisesHtml($titre), '<multi>')
565
-	) {
566
-		$lang = $GLOBALS['spip_lang'];
567
-	}
568
-
569
-	// faire un lang_select() eventuellement sur la langue inchangee
570
-	lang_select($lang);
571
-
572
-	return;
549
+    // Cas 1. forcer_lang = true et pas de critere {lang_select}
550
+    if (
551
+        isset($GLOBALS['forcer_lang'])
552
+        && $GLOBALS['forcer_lang']
553
+        && $lang_select !== 'oui'
554
+    ) {
555
+        $lang = $GLOBALS['spip_lang'];
556
+    } // Cas 2. l'objet n'a pas de langue definie (ou definie a '')
557
+    elseif (!strlen($lang)) {
558
+        $lang = $GLOBALS['spip_lang'];
559
+    } // Cas 3. l'objet est multilingue !
560
+    elseif (
561
+        $lang_select !== 'oui'
562
+        && strlen($titre) > 10
563
+        && str_contains($titre, '<multi>')
564
+        && str_contains(CollecteurHtmlTag::proteger_balisesHtml($titre), '<multi>')
565
+    ) {
566
+        $lang = $GLOBALS['spip_lang'];
567
+    }
568
+
569
+    // faire un lang_select() eventuellement sur la langue inchangee
570
+    lang_select($lang);
571
+
572
+    return;
573 573
 }
574 574
 
575 575
 
576 576
 // Si un tableau &doublons[articles] est passe en parametre,
577 577
 // il faut le nettoyer car il pourrait etre injecte en SQL
578 578
 function nettoyer_env_doublons($envd) {
579
-	foreach ($envd as $table => $liste) {
580
-		$n = '';
581
-		foreach (explode(',', $liste) as $val) {
582
-			if (($a = intval($val)) && $val === strval($a)) {
583
-				$n .= ',' . $val;
584
-			}
585
-		}
586
-		if (strlen($n)) {
587
-			$envd[$table] = $n;
588
-		} else {
589
-			unset($envd[$table]);
590
-		}
591
-	}
592
-
593
-	return $envd;
579
+    foreach ($envd as $table => $liste) {
580
+        $n = '';
581
+        foreach (explode(',', $liste) as $val) {
582
+            if (($a = intval($val)) && $val === strval($a)) {
583
+                $n .= ',' . $val;
584
+            }
585
+        }
586
+        if (strlen($n)) {
587
+            $envd[$table] = $n;
588
+        } else {
589
+            unset($envd[$table]);
590
+        }
591
+    }
592
+
593
+    return $envd;
594 594
 }
595 595
 
596 596
 /**
@@ -609,21 +609,21 @@  discard block
 block discarded – undo
609 609
  *     Opérateur trouvé (SELF ou SUBSELECT) sinon false.
610 610
  **/
611 611
 function match_self($w) {
612
-	if (is_string($w)) {
613
-		return false;
614
-	}
615
-	if (is_array($w)) {
616
-		if (in_array(reset($w), ['SELF', 'SUBSELECT'])) {
617
-			return $w;
618
-		}
619
-		foreach (array_filter($w, 'is_array') as $sw) {
620
-			if ($m = match_self($sw)) {
621
-				return $m;
622
-			}
623
-		}
624
-	}
625
-
626
-	return false;
612
+    if (is_string($w)) {
613
+        return false;
614
+    }
615
+    if (is_array($w)) {
616
+        if (in_array(reset($w), ['SELF', 'SUBSELECT'])) {
617
+            return $w;
618
+        }
619
+        foreach (array_filter($w, 'is_array') as $sw) {
620
+            if ($m = match_self($sw)) {
621
+                return $m;
622
+            }
623
+        }
624
+    }
625
+
626
+    return false;
627 627
 }
628 628
 
629 629
 /**
@@ -639,16 +639,16 @@  discard block
 block discarded – undo
639 639
  *     est remplacée par son code.
640 640
  **/
641 641
 function remplace_sous_requete($w, $sousrequete) {
642
-	if (is_array($w)) {
643
-		if (in_array(reset($w), ['SELF', 'SUBSELECT'])) {
644
-			return $sousrequete;
645
-		}
646
-		foreach ($w as $k => $sw) {
647
-			$w[$k] = remplace_sous_requete($sw, $sousrequete);
648
-		}
649
-	}
650
-
651
-	return $w;
642
+    if (is_array($w)) {
643
+        if (in_array(reset($w), ['SELF', 'SUBSELECT'])) {
644
+            return $sousrequete;
645
+        }
646
+        foreach ($w as $k => $sw) {
647
+            $w[$k] = remplace_sous_requete($sw, $sousrequete);
648
+        }
649
+    }
650
+
651
+    return $w;
652 652
 }
653 653
 
654 654
 /**
@@ -662,17 +662,17 @@  discard block
 block discarded – undo
662 662
  *     - Conditions avec des sous requêtes
663 663
  **/
664 664
 function trouver_sous_requetes($where) {
665
-	$where_simples = [];
666
-	$where_sous = [];
667
-	foreach ($where as $k => $w) {
668
-		if (match_self($w)) {
669
-			$where_sous[$k] = $w;
670
-		} else {
671
-			$where_simples[$k] = $w;
672
-		}
673
-	}
674
-
675
-	return [$where_simples, $where_sous];
665
+    $where_simples = [];
666
+    $where_sous = [];
667
+    foreach ($where as $k => $w) {
668
+        if (match_self($w)) {
669
+            $where_sous[$k] = $w;
670
+        } else {
671
+            $where_simples[$k] = $w;
672
+        }
673
+    }
674
+
675
+    return [$where_simples, $where_sous];
676 676
 }
677 677
 
678 678
 
@@ -698,293 +698,293 @@  discard block
 block discarded – undo
698 698
  * @return resource
699 699
  */
700 700
 function calculer_select(
701
-	$select = [],
702
-	$from = [],
703
-	$from_type = [],
704
-	$where = [],
705
-	$join = [],
706
-	$groupby = [],
707
-	$orderby = [],
708
-	$limit = '',
709
-	$having = [],
710
-	$table = '',
711
-	$id = '',
712
-	$serveur = '',
713
-	$requeter = true
701
+    $select = [],
702
+    $from = [],
703
+    $from_type = [],
704
+    $where = [],
705
+    $join = [],
706
+    $groupby = [],
707
+    $orderby = [],
708
+    $limit = '',
709
+    $having = [],
710
+    $table = '',
711
+    $id = '',
712
+    $serveur = '',
713
+    $requeter = true
714 714
 ) {
715 715
 
716
-	// retirer les criteres vides:
717
-	// {X ?} avec X absent de l'URL
718
-	// {par #ENV{X}} avec X absent de l'URL
719
-	// IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil)
720
-	$menage = false;
721
-	foreach ($where as $k => $v) {
722
-		if (is_array($v) && count($v)) {
723
-			if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) {
724
-				$op = false;
725
-			} elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) {
726
-				$op = false;
727
-			} else {
728
-				$op = $v[0] ?: $v;
729
-			}
730
-		} else {
731
-			$op = $v;
732
-		}
733
-		if (!$op || $op == 1 || $op == '0=0') {
734
-			unset($where[$k]);
735
-			$menage = true;
736
-		}
737
-	}
738
-
739
-	// evacuer les eventuels groupby vide issus d'un calcul dynamique
740
-	$groupby = array_diff($groupby, ['']);
741
-
742
-	// remplacer les sous requetes recursives au calcul
743
-	[$where_simples, $where_sous] = trouver_sous_requetes($where);
744
-	foreach ($where_sous as $k => $w) {
745
-		$menage = true;
746
-		// on recupere la sous requete
747
-		$sous = match_self($w);
748
-		if ($sous[0] == 'SELF') {
749
-			// c'est une sous requete identique a elle meme sous la forme (SELF,$select,$where)
750
-			array_push($where_simples, $sous[2]);
751
-			$wheresub = [
752
-				$sous[2],
753
-				'0=0'
754
-			]; // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where
755
-			$jsub = $join;
756
-			// trouver les jointures utiles a
757
-			// reinjecter dans le where de la sous requete les conditions supplementaires des jointures qui y sont mentionnees
758
-			// ie L1.objet='article'
759
-			// on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction
760
-			$i = 0;
761
-			do {
762
-				$where[$k] = remplace_sous_requete($w, '(' . calculer_select(
763
-					[$sous[1] . ' AS id'],
764
-					$from,
765
-					$from_type,
766
-					$wheresub,
767
-					$jsub,
768
-					[],
769
-					[],
770
-					'',
771
-					$having,
772
-					$table,
773
-					$id,
774
-					$serveur,
775
-					false
776
-				) . ')');
777
-				if (!$i) {
778
-					$i = 1;
779
-					$wherestring = calculer_where_to_string($where[$k]);
780
-					foreach ($join as $cle => $wj) {
781
-						if (
782
-							(is_countable($wj) ? count($wj) : 0) == 4 && str_contains($wherestring, (string) "{$cle}.")
783
-						) {
784
-							$i = 0;
785
-							$wheresub[] = $wj[3];
786
-							unset($jsub[$cle][3]);
787
-						}
788
-					}
789
-				}
790
-			} while ($i++ < 1);
791
-		}
792
-		if ($sous[0] == 'SUBSELECT') {
793
-			// c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having)
794
-			array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ?
795
-			$where[$k] = remplace_sous_requete($w, '(' . calculer_select(
796
-				$sous[1], # select
797
-				$sous[2], #from
798
-				[], #from_type
799
-				$sous[3] ? (is_array($sous[3]) ? $sous[3] : [$sous[3]]) : [],
800
-				#where, qui peut etre de la forme string comme dans sql_select
801
-					[], #join
802
-				$sous[4] ?: [], #groupby
803
-				$sous[5] ?: [], #orderby
804
-				$sous[6], #limit
805
-				$sous[7] ?: [], #having
806
-				$table,
807
-				$id,
808
-				$serveur,
809
-				false
810
-			) . ')');
811
-		}
812
-		array_pop($where_simples);
813
-	}
814
-
815
-	foreach ($having as $k => $v) {
816
-		if (!$v || $v == 1 || $v == '0=0') {
817
-			unset($having[$k]);
818
-		}
819
-	}
820
-
821
-	// Installer les jointures.
822
-	// Retirer celles seulement utiles aux criteres finalement absents mais
823
-	// parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln
824
-	// si elle est seulement utile a Ln+1 elle meme inutile
825
-
826
-	$afrom = [];
827
-	$equiv = [];
828
-	$k = count($join);
829
-	foreach (array_reverse($join, true) as $cledef => $j) {
830
-		$cle = $cledef;
831
-		// le format de join est :
832
-		// array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]])
833
-		$join[$cle] = array_values($join[$cle]); // recalculer les cles car des unset ont pu perturber
834
-		if (count($join[$cle]) == 2) {
835
-			$join[$cle][] = $join[$cle][1];
836
-		}
837
-		if ((is_countable($join[$cle]) ? count($join[$cle]) : 0) == 3) {
838
-			$join[$cle][] = '';
839
-		}
840
-		[$t, $c, $carr, $and] = $join[$cle];
841
-		// si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste
842
-		// pour compat avec ancienne convention
843
-		if (is_numeric($cle)) {
844
-			$cle = "L$k";
845
-		}
846
-		$cle_where_lie = "JOIN-$cle";
847
-		if (
848
-			!$menage
849
-			|| isset($afrom[$cle])
850
-			|| calculer_jointnul($cle, $select)
851
-			|| calculer_jointnul($cle, array_diff_key($join, [$cle => $join[$cle]]))
852
-			|| calculer_jointnul($cle, $having)
853
-			|| calculer_jointnul($cle, array_diff_key($where_simples, [$cle_where_lie => '']))
854
-		) {
855
-			// corriger les references non explicites dans select
856
-			// ou groupby
857
-			foreach ($select as $i => $s) {
858
-				if ($s == $c) {
859
-					$select[$i] = "$cle.$c AS $c";
860
-					break;
861
-				}
862
-			}
863
-			foreach ($groupby as $i => $g) {
864
-				if ($g == $c) {
865
-					$groupby[$i] = "$cle.$c";
866
-					break;
867
-				}
868
-			}
869
-			// on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin
870
-			// sans recours a preg_match
871
-			// un implode(' ',..) est fait dans reinjecte_joint un peu plus bas
872
-			$afrom[$t][$cle] = [
873
-				"\n" .
874
-				($from_type[$cle] ?? 'INNER') . ' JOIN',
875
-				$from[$cle],
876
-				"AS $cle",
877
-				'ON (',
878
-				"$cle.$c",
879
-				'=',
880
-				"$t.$carr",
881
-				($and ? 'AND ' . $and : '') .
882
-				')'
883
-			];
884
-			if (isset($afrom[$cle])) {
885
-				$afrom[$t] = $afrom[$t] + $afrom[$cle];
886
-				unset($afrom[$cle]);
887
-			}
888
-			$equiv[] = $carr;
889
-		} else {
890
-			unset($join[$cledef]);
891
-			if (isset($where_simples[$cle_where_lie])) {
892
-				unset($where_simples[$cle_where_lie]);
893
-				unset($where[$cle_where_lie]);
894
-			}
895
-		}
896
-		unset($from[$cle]);
897
-		$k--;
898
-	}
899
-
900
-	if (count($afrom)) {
901
-		// Regarder si la table principale ne sert finalement a rien comme dans
902
-		//<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3>
903
-		//<BOUCLE2(MOTS){id_article} />#TOTAL_BOUCLE<//B2>
904
-		//<BOUCLE5(RUBRIQUES){id_mot}{tout} />#TOTAL_BOUCLE<//B5>
905
-		// ou dans
906
-		//<BOUCLE8(HIERARCHIE){id_rubrique}{tout}{type='Squelette'}{inverse}{0,1}{lang_select=non} />#TOTAL_BOUCLE<//B8>
907
-		// qui comporte plusieurs jointures
908
-		// ou dans
909
-		// <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6>
910
-		// <BOUCLE7(ARTICLES){id_mot>0}{statut?} />#TOTAL_BOUCLE<//B7>
911
-		// penser a regarder aussi la clause orderby pour ne pas simplifier abusivement
912
-		// <BOUCLE9(ARTICLES){recherche truc}{par titre}>#ID_ARTICLE</BOUCLE9>
913
-		// penser a regarder aussi la clause groubpy pour ne pas simplifier abusivement
914
-		// <BOUCLE10(EVENEMENTS){id_rubrique} />#TOTAL_BOUCLE<//B10>
915
-
916
-		$t = key($from);
917
-		$c = current($from);
918
-		reset($from);
919
-		$e = '/\b(' . "$t\\." . join('|' . $t . '\.', $equiv) . ')\b/';
920
-		if (
921
-			!(
922
-				strpos($t, ' ')
923
-				// jointure des le depart cf boucle_doc
924
-				|| calculer_jointnul($t, $select, $e)
925
-				|| calculer_jointnul($t, $join, $e)
926
-				|| calculer_jointnul($t, $where, $e)
927
-				|| calculer_jointnul($t, $orderby, $e)
928
-				|| calculer_jointnul($t, $groupby, $e) || calculer_jointnul($t, $having, $e)
929
-			)
930
-			&& count($afrom[$t])
931
-		) {
932
-			$nfrom = reset($afrom[$t]);
933
-			$nt = array_key_first($afrom[$t]);
934
-			unset($from[$t]);
935
-			$from[$nt] = $nfrom[1];
936
-			unset($afrom[$t][$nt]);
937
-			$afrom[$nt] = $afrom[$t];
938
-			unset($afrom[$t]);
939
-			$e = '/\b' . preg_quote($nfrom[6]) . '\b/';
940
-			$t = $nfrom[4];
941
-			$alias = '';
942
-			// verifier que les deux cles sont homonymes, sinon installer un alias dans le select
943
-			$oldcle = explode('.', $nfrom[6]);
944
-			$oldcle = end($oldcle);
945
-			$newcle = explode('.', $nfrom[4]);
946
-			$newcle = end($newcle);
947
-			if ($newcle != $oldcle) {
948
-				// si l'ancienne cle etait deja dans le select avec un AS
949
-				// reprendre simplement ce AS
950
-				$as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/';
951
-				if (preg_match($as, implode(',', $select), $m)) {
952
-					$alias = '';
953
-				} else {
954
-					$alias = ', ' . $nfrom[4] . " AS $oldcle";
955
-				}
956
-			}
957
-			$select = remplacer_jointnul($t . $alias, $select, $e);
958
-			$join = remplacer_jointnul($t, $join, $e);
959
-			$where = remplacer_jointnul($t, $where, $e);
960
-			$having = remplacer_jointnul($t, $having, $e);
961
-			$groupby = remplacer_jointnul($t, $groupby, $e);
962
-			$orderby = remplacer_jointnul($t, $orderby, $e);
963
-		}
964
-		$from = reinjecte_joint($afrom, $from);
965
-	}
966
-	if (empty($GLOBALS['debug']) || !is_array($GLOBALS['debug'])) {
967
-		$wasdebug = empty($GLOBALS['debug']) ? false : $GLOBALS['debug'];
968
-		$GLOBALS['debug'] = [];
969
-		if ($wasdebug) {
970
-			$GLOBALS['debug']['debug'] = true;
971
-		}
972
-	}
973
-	$GLOBALS['debug']['aucasou'] = [$table, $id, $serveur, $requeter];
974
-	$r = sql_select(
975
-		$select,
976
-		$from,
977
-		$where,
978
-		$groupby,
979
-		array_filter($orderby),
980
-		$limit,
981
-		$having,
982
-		$serveur,
983
-		$requeter
984
-	);
985
-	unset($GLOBALS['debug']['aucasou']);
986
-
987
-	return $r;
716
+    // retirer les criteres vides:
717
+    // {X ?} avec X absent de l'URL
718
+    // {par #ENV{X}} avec X absent de l'URL
719
+    // IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil)
720
+    $menage = false;
721
+    foreach ($where as $k => $v) {
722
+        if (is_array($v) && count($v)) {
723
+            if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) {
724
+                $op = false;
725
+            } elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) {
726
+                $op = false;
727
+            } else {
728
+                $op = $v[0] ?: $v;
729
+            }
730
+        } else {
731
+            $op = $v;
732
+        }
733
+        if (!$op || $op == 1 || $op == '0=0') {
734
+            unset($where[$k]);
735
+            $menage = true;
736
+        }
737
+    }
738
+
739
+    // evacuer les eventuels groupby vide issus d'un calcul dynamique
740
+    $groupby = array_diff($groupby, ['']);
741
+
742
+    // remplacer les sous requetes recursives au calcul
743
+    [$where_simples, $where_sous] = trouver_sous_requetes($where);
744
+    foreach ($where_sous as $k => $w) {
745
+        $menage = true;
746
+        // on recupere la sous requete
747
+        $sous = match_self($w);
748
+        if ($sous[0] == 'SELF') {
749
+            // c'est une sous requete identique a elle meme sous la forme (SELF,$select,$where)
750
+            array_push($where_simples, $sous[2]);
751
+            $wheresub = [
752
+                $sous[2],
753
+                '0=0'
754
+            ]; // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where
755
+            $jsub = $join;
756
+            // trouver les jointures utiles a
757
+            // reinjecter dans le where de la sous requete les conditions supplementaires des jointures qui y sont mentionnees
758
+            // ie L1.objet='article'
759
+            // on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction
760
+            $i = 0;
761
+            do {
762
+                $where[$k] = remplace_sous_requete($w, '(' . calculer_select(
763
+                    [$sous[1] . ' AS id'],
764
+                    $from,
765
+                    $from_type,
766
+                    $wheresub,
767
+                    $jsub,
768
+                    [],
769
+                    [],
770
+                    '',
771
+                    $having,
772
+                    $table,
773
+                    $id,
774
+                    $serveur,
775
+                    false
776
+                ) . ')');
777
+                if (!$i) {
778
+                    $i = 1;
779
+                    $wherestring = calculer_where_to_string($where[$k]);
780
+                    foreach ($join as $cle => $wj) {
781
+                        if (
782
+                            (is_countable($wj) ? count($wj) : 0) == 4 && str_contains($wherestring, (string) "{$cle}.")
783
+                        ) {
784
+                            $i = 0;
785
+                            $wheresub[] = $wj[3];
786
+                            unset($jsub[$cle][3]);
787
+                        }
788
+                    }
789
+                }
790
+            } while ($i++ < 1);
791
+        }
792
+        if ($sous[0] == 'SUBSELECT') {
793
+            // c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having)
794
+            array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ?
795
+            $where[$k] = remplace_sous_requete($w, '(' . calculer_select(
796
+                $sous[1], # select
797
+                $sous[2], #from
798
+                [], #from_type
799
+                $sous[3] ? (is_array($sous[3]) ? $sous[3] : [$sous[3]]) : [],
800
+                #where, qui peut etre de la forme string comme dans sql_select
801
+                    [], #join
802
+                $sous[4] ?: [], #groupby
803
+                $sous[5] ?: [], #orderby
804
+                $sous[6], #limit
805
+                $sous[7] ?: [], #having
806
+                $table,
807
+                $id,
808
+                $serveur,
809
+                false
810
+            ) . ')');
811
+        }
812
+        array_pop($where_simples);
813
+    }
814
+
815
+    foreach ($having as $k => $v) {
816
+        if (!$v || $v == 1 || $v == '0=0') {
817
+            unset($having[$k]);
818
+        }
819
+    }
820
+
821
+    // Installer les jointures.
822
+    // Retirer celles seulement utiles aux criteres finalement absents mais
823
+    // parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln
824
+    // si elle est seulement utile a Ln+1 elle meme inutile
825
+
826
+    $afrom = [];
827
+    $equiv = [];
828
+    $k = count($join);
829
+    foreach (array_reverse($join, true) as $cledef => $j) {
830
+        $cle = $cledef;
831
+        // le format de join est :
832
+        // array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]])
833
+        $join[$cle] = array_values($join[$cle]); // recalculer les cles car des unset ont pu perturber
834
+        if (count($join[$cle]) == 2) {
835
+            $join[$cle][] = $join[$cle][1];
836
+        }
837
+        if ((is_countable($join[$cle]) ? count($join[$cle]) : 0) == 3) {
838
+            $join[$cle][] = '';
839
+        }
840
+        [$t, $c, $carr, $and] = $join[$cle];
841
+        // si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste
842
+        // pour compat avec ancienne convention
843
+        if (is_numeric($cle)) {
844
+            $cle = "L$k";
845
+        }
846
+        $cle_where_lie = "JOIN-$cle";
847
+        if (
848
+            !$menage
849
+            || isset($afrom[$cle])
850
+            || calculer_jointnul($cle, $select)
851
+            || calculer_jointnul($cle, array_diff_key($join, [$cle => $join[$cle]]))
852
+            || calculer_jointnul($cle, $having)
853
+            || calculer_jointnul($cle, array_diff_key($where_simples, [$cle_where_lie => '']))
854
+        ) {
855
+            // corriger les references non explicites dans select
856
+            // ou groupby
857
+            foreach ($select as $i => $s) {
858
+                if ($s == $c) {
859
+                    $select[$i] = "$cle.$c AS $c";
860
+                    break;
861
+                }
862
+            }
863
+            foreach ($groupby as $i => $g) {
864
+                if ($g == $c) {
865
+                    $groupby[$i] = "$cle.$c";
866
+                    break;
867
+                }
868
+            }
869
+            // on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin
870
+            // sans recours a preg_match
871
+            // un implode(' ',..) est fait dans reinjecte_joint un peu plus bas
872
+            $afrom[$t][$cle] = [
873
+                "\n" .
874
+                ($from_type[$cle] ?? 'INNER') . ' JOIN',
875
+                $from[$cle],
876
+                "AS $cle",
877
+                'ON (',
878
+                "$cle.$c",
879
+                '=',
880
+                "$t.$carr",
881
+                ($and ? 'AND ' . $and : '') .
882
+                ')'
883
+            ];
884
+            if (isset($afrom[$cle])) {
885
+                $afrom[$t] = $afrom[$t] + $afrom[$cle];
886
+                unset($afrom[$cle]);
887
+            }
888
+            $equiv[] = $carr;
889
+        } else {
890
+            unset($join[$cledef]);
891
+            if (isset($where_simples[$cle_where_lie])) {
892
+                unset($where_simples[$cle_where_lie]);
893
+                unset($where[$cle_where_lie]);
894
+            }
895
+        }
896
+        unset($from[$cle]);
897
+        $k--;
898
+    }
899
+
900
+    if (count($afrom)) {
901
+        // Regarder si la table principale ne sert finalement a rien comme dans
902
+        //<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3>
903
+        //<BOUCLE2(MOTS){id_article} />#TOTAL_BOUCLE<//B2>
904
+        //<BOUCLE5(RUBRIQUES){id_mot}{tout} />#TOTAL_BOUCLE<//B5>
905
+        // ou dans
906
+        //<BOUCLE8(HIERARCHIE){id_rubrique}{tout}{type='Squelette'}{inverse}{0,1}{lang_select=non} />#TOTAL_BOUCLE<//B8>
907
+        // qui comporte plusieurs jointures
908
+        // ou dans
909
+        // <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6>
910
+        // <BOUCLE7(ARTICLES){id_mot>0}{statut?} />#TOTAL_BOUCLE<//B7>
911
+        // penser a regarder aussi la clause orderby pour ne pas simplifier abusivement
912
+        // <BOUCLE9(ARTICLES){recherche truc}{par titre}>#ID_ARTICLE</BOUCLE9>
913
+        // penser a regarder aussi la clause groubpy pour ne pas simplifier abusivement
914
+        // <BOUCLE10(EVENEMENTS){id_rubrique} />#TOTAL_BOUCLE<//B10>
915
+
916
+        $t = key($from);
917
+        $c = current($from);
918
+        reset($from);
919
+        $e = '/\b(' . "$t\\." . join('|' . $t . '\.', $equiv) . ')\b/';
920
+        if (
921
+            !(
922
+                strpos($t, ' ')
923
+                // jointure des le depart cf boucle_doc
924
+                || calculer_jointnul($t, $select, $e)
925
+                || calculer_jointnul($t, $join, $e)
926
+                || calculer_jointnul($t, $where, $e)
927
+                || calculer_jointnul($t, $orderby, $e)
928
+                || calculer_jointnul($t, $groupby, $e) || calculer_jointnul($t, $having, $e)
929
+            )
930
+            && count($afrom[$t])
931
+        ) {
932
+            $nfrom = reset($afrom[$t]);
933
+            $nt = array_key_first($afrom[$t]);
934
+            unset($from[$t]);
935
+            $from[$nt] = $nfrom[1];
936
+            unset($afrom[$t][$nt]);
937
+            $afrom[$nt] = $afrom[$t];
938
+            unset($afrom[$t]);
939
+            $e = '/\b' . preg_quote($nfrom[6]) . '\b/';
940
+            $t = $nfrom[4];
941
+            $alias = '';
942
+            // verifier que les deux cles sont homonymes, sinon installer un alias dans le select
943
+            $oldcle = explode('.', $nfrom[6]);
944
+            $oldcle = end($oldcle);
945
+            $newcle = explode('.', $nfrom[4]);
946
+            $newcle = end($newcle);
947
+            if ($newcle != $oldcle) {
948
+                // si l'ancienne cle etait deja dans le select avec un AS
949
+                // reprendre simplement ce AS
950
+                $as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/';
951
+                if (preg_match($as, implode(',', $select), $m)) {
952
+                    $alias = '';
953
+                } else {
954
+                    $alias = ', ' . $nfrom[4] . " AS $oldcle";
955
+                }
956
+            }
957
+            $select = remplacer_jointnul($t . $alias, $select, $e);
958
+            $join = remplacer_jointnul($t, $join, $e);
959
+            $where = remplacer_jointnul($t, $where, $e);
960
+            $having = remplacer_jointnul($t, $having, $e);
961
+            $groupby = remplacer_jointnul($t, $groupby, $e);
962
+            $orderby = remplacer_jointnul($t, $orderby, $e);
963
+        }
964
+        $from = reinjecte_joint($afrom, $from);
965
+    }
966
+    if (empty($GLOBALS['debug']) || !is_array($GLOBALS['debug'])) {
967
+        $wasdebug = empty($GLOBALS['debug']) ? false : $GLOBALS['debug'];
968
+        $GLOBALS['debug'] = [];
969
+        if ($wasdebug) {
970
+            $GLOBALS['debug']['debug'] = true;
971
+        }
972
+    }
973
+    $GLOBALS['debug']['aucasou'] = [$table, $id, $serveur, $requeter];
974
+    $r = sql_select(
975
+        $select,
976
+        $from,
977
+        $where,
978
+        $groupby,
979
+        array_filter($orderby),
980
+        $limit,
981
+        $having,
982
+        $serveur,
983
+        $requeter
984
+    );
985
+    unset($GLOBALS['debug']['aucasou']);
986
+
987
+    return $r;
988 988
 }
989 989
 
990 990
 /**
@@ -995,79 +995,79 @@  discard block
 block discarded – undo
995 995
  * @return string
996 996
  */
997 997
 function calculer_where_to_string($v, $join = 'AND') {
998
-	if (empty($v)) {
999
-		return '';
1000
-	}
1001
-
1002
-	if (!is_array($v)) {
1003
-		return $v;
1004
-	} else {
1005
-		$exp = '';
1006
-		if (strtoupper($join) === 'AND') {
1007
-			return $exp . join(" $join ", array_map('calculer_where_to_string', $v));
1008
-		} else {
1009
-			return $exp . join($join, $v);
1010
-		}
1011
-	}
998
+    if (empty($v)) {
999
+        return '';
1000
+    }
1001
+
1002
+    if (!is_array($v)) {
1003
+        return $v;
1004
+    } else {
1005
+        $exp = '';
1006
+        if (strtoupper($join) === 'AND') {
1007
+            return $exp . join(" $join ", array_map('calculer_where_to_string', $v));
1008
+        } else {
1009
+            return $exp . join($join, $v);
1010
+        }
1011
+    }
1012 1012
 }
1013 1013
 
1014 1014
 
1015 1015
 //condition suffisante (mais non necessaire) pour qu'une table soit utile
1016 1016
 
1017 1017
 function calculer_jointnul($cle, $exp, $equiv = '') {
1018
-	if (!is_array($exp)) {
1019
-		if ($equiv) {
1020
-			$exp = preg_replace($equiv, '', $exp);
1021
-		}
1022
-
1023
-		return preg_match("/\\b$cle\\./", $exp);
1024
-	} else {
1025
-		foreach ($exp as $v) {
1026
-			if (calculer_jointnul($cle, $v, $equiv)) {
1027
-				return true;
1028
-			}
1029
-		}
1030
-
1031
-		return false;
1032
-	}
1018
+    if (!is_array($exp)) {
1019
+        if ($equiv) {
1020
+            $exp = preg_replace($equiv, '', $exp);
1021
+        }
1022
+
1023
+        return preg_match("/\\b$cle\\./", $exp);
1024
+    } else {
1025
+        foreach ($exp as $v) {
1026
+            if (calculer_jointnul($cle, $v, $equiv)) {
1027
+                return true;
1028
+            }
1029
+        }
1030
+
1031
+        return false;
1032
+    }
1033 1033
 }
1034 1034
 
1035 1035
 function reinjecte_joint($afrom, $from) {
1036
-	$from_synth = [];
1037
-	foreach ($from as $k => $v) {
1038
-		$from_synth[$k] = $from[$k];
1039
-		if (isset($afrom[$k])) {
1040
-			foreach ($afrom[$k] as $kk => $vv) {
1041
-				$afrom[$k][$kk] = implode(' ', $afrom[$k][$kk]);
1042
-			}
1043
-			$from_synth["$k@"] = implode(' ', $afrom[$k]);
1044
-			unset($afrom[$k]);
1045
-		}
1046
-	}
1047
-
1048
-	return $from_synth;
1036
+    $from_synth = [];
1037
+    foreach ($from as $k => $v) {
1038
+        $from_synth[$k] = $from[$k];
1039
+        if (isset($afrom[$k])) {
1040
+            foreach ($afrom[$k] as $kk => $vv) {
1041
+                $afrom[$k][$kk] = implode(' ', $afrom[$k][$kk]);
1042
+            }
1043
+            $from_synth["$k@"] = implode(' ', $afrom[$k]);
1044
+            unset($afrom[$k]);
1045
+        }
1046
+    }
1047
+
1048
+    return $from_synth;
1049 1049
 }
1050 1050
 
1051 1051
 function remplacer_jointnul($cle, $exp, $equiv = '') {
1052
-	if (!is_array($exp)) {
1053
-		return preg_replace($equiv, $cle, $exp);
1054
-	} else {
1055
-		foreach ($exp as $k => $v) {
1056
-			$exp[$k] = remplacer_jointnul($cle, $v, $equiv);
1057
-		}
1058
-
1059
-		return $exp;
1060
-	}
1052
+    if (!is_array($exp)) {
1053
+        return preg_replace($equiv, $cle, $exp);
1054
+    } else {
1055
+        foreach ($exp as $k => $v) {
1056
+            $exp[$k] = remplacer_jointnul($cle, $v, $equiv);
1057
+        }
1058
+
1059
+        return $exp;
1060
+    }
1061 1061
 }
1062 1062
 
1063 1063
 // calcul du nom du squelette
1064 1064
 function calculer_nom_fonction_squel($skel, $mime_type = 'html', string $connect = '') {
1065
-	// ne pas doublonner les squelette selon qu'ils sont calcules depuis ecrire/ ou depuis la racine
1066
-	if (($l = strlen(_DIR_RACINE)) && strncmp($skel, _DIR_RACINE, $l) == 0) {
1067
-		$skel = substr($skel, strlen(_DIR_RACINE));
1068
-	}
1069
-
1070
-	return $mime_type
1071
-	. (!$connect ? '' : preg_replace('/\W/', '_', $connect)) . '_'
1072
-	. md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : ''));
1065
+    // ne pas doublonner les squelette selon qu'ils sont calcules depuis ecrire/ ou depuis la racine
1066
+    if (($l = strlen(_DIR_RACINE)) && strncmp($skel, _DIR_RACINE, $l) == 0) {
1067
+        $skel = substr($skel, strlen(_DIR_RACINE));
1068
+    }
1069
+
1070
+    return $mime_type
1071
+    . (!$connect ? '' : preg_replace('/\W/', '_', $connect)) . '_'
1072
+    . md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : ''));
1073 1073
 }
Please login to merge, or discard this patch.
ecrire/public/aiguiller.php 3 patches
Indentation   +289 added lines, -289 removed lines patch added patch discarded remove patch
@@ -10,7 +10,7 @@  discard block
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 /**
@@ -18,154 +18,154 @@  discard block
 block discarded – undo
18 18
  * @return string
19 19
  */
20 20
 function securiser_redirect_action($redirect) {
21
-	$redirect ??= '';
22
-	// cas d'un double urlencode : si un urldecode de l'url n'est pas secure, on retient ca comme redirect
23
-	if (str_contains($redirect, '%')) {
24
-		$r2 = urldecode($redirect);
25
-		if (($r3 = securiser_redirect_action($r2)) !== $r2) {
26
-			return $r3;
27
-		}
28
-	}
29
-	if (
30
-		(tester_url_absolue($redirect) || preg_match(',^\w+:,', trim($redirect)))
31
-		&& !defined('_AUTORISER_ACTION_ABS_REDIRECT')
32
-	) {
33
-		// si l'url est une url du site, on la laisse passer sans rien faire
34
-		// c'est encore le plus simple
35
-		$base = $GLOBALS['meta']['adresse_site'] . '/';
36
-		if (strlen($base) && str_starts_with($redirect, $base)) {
37
-			return $redirect;
38
-		}
39
-		$base = url_de_base();
40
-		if (strlen($base) && str_starts_with($redirect, $base)) {
41
-			return $redirect;
42
-		}
21
+    $redirect ??= '';
22
+    // cas d'un double urlencode : si un urldecode de l'url n'est pas secure, on retient ca comme redirect
23
+    if (str_contains($redirect, '%')) {
24
+        $r2 = urldecode($redirect);
25
+        if (($r3 = securiser_redirect_action($r2)) !== $r2) {
26
+            return $r3;
27
+        }
28
+    }
29
+    if (
30
+        (tester_url_absolue($redirect) || preg_match(',^\w+:,', trim($redirect)))
31
+        && !defined('_AUTORISER_ACTION_ABS_REDIRECT')
32
+    ) {
33
+        // si l'url est une url du site, on la laisse passer sans rien faire
34
+        // c'est encore le plus simple
35
+        $base = $GLOBALS['meta']['adresse_site'] . '/';
36
+        if (strlen($base) && str_starts_with($redirect, $base)) {
37
+            return $redirect;
38
+        }
39
+        $base = url_de_base();
40
+        if (strlen($base) && str_starts_with($redirect, $base)) {
41
+            return $redirect;
42
+        }
43 43
 
44
-		return '';
45
-	}
44
+        return '';
45
+    }
46 46
 
47
-	return $redirect;
47
+    return $redirect;
48 48
 }
49 49
 
50 50
 function traiter_appels_actions() {
51
-	// cas de l'appel qui renvoie une redirection (302) ou rien (204)
52
-	if ($action = _request('action')) {
53
-		include_spip('base/abstract_sql'); // chargement systematique pour les actions
54
-		include_spip('inc/autoriser');
55
-		include_spip('inc/headers');
56
-		include_spip('inc/actions');
57
-		// des actions peuvent appeler _T
58
-		if (!isset($GLOBALS['spip_lang'])) {
59
-			include_spip('inc/lang');
60
-			utiliser_langue_visiteur();
61
-		}
62
-		// si l'action est provoque par un hit {ajax}
63
-		// il faut transmettre l'env ajax au redirect
64
-		// on le met avant dans la query string au cas ou l'action fait elle meme sa redirection
65
-		if (
66
-			($v = _request('var_ajax'))
67
-			&& $v !== 'form'
68
-			&& ($args = _request('var_ajax_env'))
69
-			&& ($url = _request('redirect'))
70
-		) {
71
-			$url = parametre_url($url, 'var_ajax', $v, '&');
72
-			$url = parametre_url($url, 'var_ajax_env', $args, '&');
73
-			set_request('redirect', $url);
74
-		} else {
75
-			if (_request('redirect')) {
76
-				set_request('redirect', securiser_redirect_action(_request('redirect')));
77
-			}
78
-		}
79
-		$var_f = charger_fonction($action, 'action');
80
-		$var_f();
81
-		if (!isset($GLOBALS['redirect'])) {
82
-			$GLOBALS['redirect'] = _request('redirect') ?? '';
83
-			if ($_SERVER['REQUEST_METHOD'] === 'POST') {
84
-				$GLOBALS['redirect'] = urldecode($GLOBALS['redirect']);
85
-			}
86
-			$GLOBALS['redirect'] = securiser_redirect_action($GLOBALS['redirect']);
87
-		}
88
-		if ($url = $GLOBALS['redirect']) {
89
-			// si l'action est provoque par un hit {ajax}
90
-			// il faut transmettre l'env ajax au redirect
91
-			// qui a pu etre defini par l'action
92
-			if (
93
-				($v = _request('var_ajax'))
94
-				&& $v !== 'form'
95
-				&& ($args = _request('var_ajax_env'))
96
-			) {
97
-				$url = parametre_url($url, 'var_ajax', $v, '&');
98
-				$url = parametre_url($url, 'var_ajax_env', $args, '&');
99
-				// passer l'ancre en variable pour pouvoir la gerer cote serveur
100
-				$url = preg_replace(',#([^#&?]+)$,', "&var_ajax_ancre=\\1", $url);
101
-			}
102
-			$url = str_replace('&amp;', '&', $url); // les redirections se font en &, pas en en &amp;
103
-			redirige_par_entete($url);
104
-		}
51
+    // cas de l'appel qui renvoie une redirection (302) ou rien (204)
52
+    if ($action = _request('action')) {
53
+        include_spip('base/abstract_sql'); // chargement systematique pour les actions
54
+        include_spip('inc/autoriser');
55
+        include_spip('inc/headers');
56
+        include_spip('inc/actions');
57
+        // des actions peuvent appeler _T
58
+        if (!isset($GLOBALS['spip_lang'])) {
59
+            include_spip('inc/lang');
60
+            utiliser_langue_visiteur();
61
+        }
62
+        // si l'action est provoque par un hit {ajax}
63
+        // il faut transmettre l'env ajax au redirect
64
+        // on le met avant dans la query string au cas ou l'action fait elle meme sa redirection
65
+        if (
66
+            ($v = _request('var_ajax'))
67
+            && $v !== 'form'
68
+            && ($args = _request('var_ajax_env'))
69
+            && ($url = _request('redirect'))
70
+        ) {
71
+            $url = parametre_url($url, 'var_ajax', $v, '&');
72
+            $url = parametre_url($url, 'var_ajax_env', $args, '&');
73
+            set_request('redirect', $url);
74
+        } else {
75
+            if (_request('redirect')) {
76
+                set_request('redirect', securiser_redirect_action(_request('redirect')));
77
+            }
78
+        }
79
+        $var_f = charger_fonction($action, 'action');
80
+        $var_f();
81
+        if (!isset($GLOBALS['redirect'])) {
82
+            $GLOBALS['redirect'] = _request('redirect') ?? '';
83
+            if ($_SERVER['REQUEST_METHOD'] === 'POST') {
84
+                $GLOBALS['redirect'] = urldecode($GLOBALS['redirect']);
85
+            }
86
+            $GLOBALS['redirect'] = securiser_redirect_action($GLOBALS['redirect']);
87
+        }
88
+        if ($url = $GLOBALS['redirect']) {
89
+            // si l'action est provoque par un hit {ajax}
90
+            // il faut transmettre l'env ajax au redirect
91
+            // qui a pu etre defini par l'action
92
+            if (
93
+                ($v = _request('var_ajax'))
94
+                && $v !== 'form'
95
+                && ($args = _request('var_ajax_env'))
96
+            ) {
97
+                $url = parametre_url($url, 'var_ajax', $v, '&');
98
+                $url = parametre_url($url, 'var_ajax_env', $args, '&');
99
+                // passer l'ancre en variable pour pouvoir la gerer cote serveur
100
+                $url = preg_replace(',#([^#&?]+)$,', "&var_ajax_ancre=\\1", $url);
101
+            }
102
+            $url = str_replace('&amp;', '&', $url); // les redirections se font en &, pas en en &amp;
103
+            redirige_par_entete($url);
104
+        }
105 105
 
106
-		// attention : avec zlib.output_compression=1 on a vu des cas de ob_get_length() qui renvoi 0
107
-		// et du coup en renvoi un status 204 a tort (vu sur le menu rubriques notamment)
108
-		if (!headers_sent() && !ob_get_length()) {
109
-			http_response_code(204);
110
-		} // No Content
111
-		return true;
112
-	}
106
+        // attention : avec zlib.output_compression=1 on a vu des cas de ob_get_length() qui renvoi 0
107
+        // et du coup en renvoi un status 204 a tort (vu sur le menu rubriques notamment)
108
+        if (!headers_sent() && !ob_get_length()) {
109
+            http_response_code(204);
110
+        } // No Content
111
+        return true;
112
+    }
113 113
 
114
-	return false;
114
+    return false;
115 115
 }
116 116
 
117 117
 
118 118
 function refuser_traiter_formulaire_ajax() {
119
-	if (
120
-		($v = _request('var_ajax'))
121
-		&& $v == 'form'
122
-		&& ($form = _request('formulaire_action'))
123
-		&& ($args = _request('formulaire_action_args'))
124
-		&& decoder_contexte_ajax($args, $form) !== false
125
-	) {
126
-		// on est bien dans le contexte de traitement d'un formulaire en ajax
127
-		// mais traiter ne veut pas
128
-		// on le dit a la page qui va resumbit
129
-		// sans ajax
130
-		include_spip('inc/actions');
131
-		ajax_retour('noajax', false);
132
-		exit;
133
-	}
119
+    if (
120
+        ($v = _request('var_ajax'))
121
+        && $v == 'form'
122
+        && ($form = _request('formulaire_action'))
123
+        && ($args = _request('formulaire_action_args'))
124
+        && decoder_contexte_ajax($args, $form) !== false
125
+    ) {
126
+        // on est bien dans le contexte de traitement d'un formulaire en ajax
127
+        // mais traiter ne veut pas
128
+        // on le dit a la page qui va resumbit
129
+        // sans ajax
130
+        include_spip('inc/actions');
131
+        ajax_retour('noajax', false);
132
+        exit;
133
+    }
134 134
 }
135 135
 
136 136
 function traiter_appels_inclusions_ajax() {
137
-	// traiter les appels de bloc ajax (ex: pagination)
138
-	if (
139
-		($v = _request('var_ajax'))
140
-		&& $v !== 'form'
141
-		&& ($args = _request('var_ajax_env'))
142
-	) {
143
-		include_spip('inc/filtres');
144
-		include_spip('inc/actions');
145
-		if (
146
-			($args = decoder_contexte_ajax($args)) && ($fond = $args['fond'])
147
-		) {
148
-			include_spip('public/assembler');
149
-			$contexte = calculer_contexte();
150
-			$contexte = array_merge($args, $contexte);
151
-			$page = recuperer_fond($fond, $contexte, ['trim' => false]);
152
-			$texte = $page;
153
-			if ($ancre = _request('var_ajax_ancre')) {
154
-				// pas n'importe quoi quand meme dans la variable !
155
-				$ancre = str_replace(['<', '"', "'"], ['&lt;', '&quot;', ''], $ancre);
156
-				$texte = "<a href='#$ancre' name='ajax_ancre' style='display:none;'>anchor</a>" . $texte;
157
-			}
158
-		} else {
159
-			include_spip('inc/headers');
160
-			http_response_code(400);
161
-			$texte = _L('signature ajax bloc incorrecte');
162
-		}
163
-		ajax_retour($texte, false);
137
+    // traiter les appels de bloc ajax (ex: pagination)
138
+    if (
139
+        ($v = _request('var_ajax'))
140
+        && $v !== 'form'
141
+        && ($args = _request('var_ajax_env'))
142
+    ) {
143
+        include_spip('inc/filtres');
144
+        include_spip('inc/actions');
145
+        if (
146
+            ($args = decoder_contexte_ajax($args)) && ($fond = $args['fond'])
147
+        ) {
148
+            include_spip('public/assembler');
149
+            $contexte = calculer_contexte();
150
+            $contexte = array_merge($args, $contexte);
151
+            $page = recuperer_fond($fond, $contexte, ['trim' => false]);
152
+            $texte = $page;
153
+            if ($ancre = _request('var_ajax_ancre')) {
154
+                // pas n'importe quoi quand meme dans la variable !
155
+                $ancre = str_replace(['<', '"', "'"], ['&lt;', '&quot;', ''], $ancre);
156
+                $texte = "<a href='#$ancre' name='ajax_ancre' style='display:none;'>anchor</a>" . $texte;
157
+            }
158
+        } else {
159
+            include_spip('inc/headers');
160
+            http_response_code(400);
161
+            $texte = _L('signature ajax bloc incorrecte');
162
+        }
163
+        ajax_retour($texte, false);
164 164
 
165
-		return true; // on a fini le hit
166
-	}
165
+        return true; // on a fini le hit
166
+    }
167 167
 
168
-	return false;
168
+    return false;
169 169
 }
170 170
 
171 171
 // au 1er appel, traite les formulaires dynamiques charger/verifier/traiter
@@ -173,176 +173,176 @@  discard block
 block discarded – undo
173 173
 // Le 1er renvoie True si il faut faire exit a la sortie
174 174
 
175 175
 function traiter_formulaires_dynamiques($get = false) {
176
-	static $post = [];
177
-	static $done = false;
176
+    static $post = [];
177
+    static $done = false;
178 178
 
179
-	if ($get) {
180
-		return $post;
181
-	}
182
-	if ($done) {
183
-		return false;
184
-	}
185
-	$done = true;
179
+    if ($get) {
180
+        return $post;
181
+    }
182
+    if ($done) {
183
+        return false;
184
+    }
185
+    $done = true;
186 186
 
187
-	if (
188
-		!(($form = _request('formulaire_action'))
189
-		&& ($args = _request('formulaire_action_args')))
190
-	) {
191
-		return false;
192
-	} // le hit peut continuer normalement
187
+    if (
188
+        !(($form = _request('formulaire_action'))
189
+        && ($args = _request('formulaire_action_args')))
190
+    ) {
191
+        return false;
192
+    } // le hit peut continuer normalement
193 193
 
194
-	// verifier que le post est licite (du meme auteur ou d'une session anonyme)
195
-	$sign = _request('formulaire_action_sign');
196
-	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
197
-		if (empty($sign)) {
198
-			spip_logger('formulaires')->error("signature ajax form incorrecte : $form (formulaire non signe mais on a une session)");
199
-			return false;
200
-		}
201
-		$securiser_action = charger_fonction('securiser_action', 'inc');
202
-		$secu = $securiser_action($form, $args, '', -1);
203
-		if ($sign !== $secu['hash']) {
204
-			spip_logger('formulaires')->error("signature ajax form incorrecte : $form (formulaire signe mais ne correspond pas a la session)");
205
-			return false;
206
-		}
207
-	}
208
-	else {
209
-		if (!empty($sign)) {
210
-			spip_logger('formulaires')->error("signature ajax form incorrecte : $form (formulaire signe mais pas de session)");
211
-			return false;
212
-		}
213
-	}
194
+    // verifier que le post est licite (du meme auteur ou d'une session anonyme)
195
+    $sign = _request('formulaire_action_sign');
196
+    if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
197
+        if (empty($sign)) {
198
+            spip_logger('formulaires')->error("signature ajax form incorrecte : $form (formulaire non signe mais on a une session)");
199
+            return false;
200
+        }
201
+        $securiser_action = charger_fonction('securiser_action', 'inc');
202
+        $secu = $securiser_action($form, $args, '', -1);
203
+        if ($sign !== $secu['hash']) {
204
+            spip_logger('formulaires')->error("signature ajax form incorrecte : $form (formulaire signe mais ne correspond pas a la session)");
205
+            return false;
206
+        }
207
+    }
208
+    else {
209
+        if (!empty($sign)) {
210
+            spip_logger('formulaires')->error("signature ajax form incorrecte : $form (formulaire signe mais pas de session)");
211
+            return false;
212
+        }
213
+    }
214 214
 
215
-	include_spip('inc/filtres');
216
-	if (($args = decoder_contexte_ajax($args, $form)) === false) {
217
-		spip_logger('formulaires')->error("signature ajax form incorrecte : $form (encodage corrompu)");
215
+    include_spip('inc/filtres');
216
+    if (($args = decoder_contexte_ajax($args, $form)) === false) {
217
+        spip_logger('formulaires')->error("signature ajax form incorrecte : $form (encodage corrompu)");
218 218
 
219
-		return false; // continuons le hit comme si de rien etait
220
-	} else {
221
-		include_spip('inc/lang');
222
-		// sauvegarder la lang en cours
223
-		$old_lang = $GLOBALS['spip_lang'];
224
-		// changer la langue avec celle qui a cours dans le formulaire
225
-		// on la depile de $args car c'est un argument implicite masque
226
-		changer_langue(array_shift($args));
219
+        return false; // continuons le hit comme si de rien etait
220
+    } else {
221
+        include_spip('inc/lang');
222
+        // sauvegarder la lang en cours
223
+        $old_lang = $GLOBALS['spip_lang'];
224
+        // changer la langue avec celle qui a cours dans le formulaire
225
+        // on la depile de $args car c'est un argument implicite masque
226
+        changer_langue(array_shift($args));
227 227
 
228 228
 
229
-		// inclure mes_fonctions et autres filtres avant verifier/traiter
230
-		include_fichiers_fonctions();
231
-		// ainsi que l'API SQL bien utile dans verifier/traiter
232
-		include_spip('base/abstract_sql');
229
+        // inclure mes_fonctions et autres filtres avant verifier/traiter
230
+        include_fichiers_fonctions();
231
+        // ainsi que l'API SQL bien utile dans verifier/traiter
232
+        include_spip('base/abstract_sql');
233 233
 
234
-		/**
235
-		 * Pipeline exécuté lors de la soumission d'un formulaire,
236
-		 * mais avant l'appel de la fonction de vérification.
237
-		 */
238
-		pipeline(
239
-			'formulaire_receptionner',
240
-			[
241
-				'args' => ['form' => $form, 'args' => $args],
242
-				'data' => null,
243
-			]
244
-		);
234
+        /**
235
+         * Pipeline exécuté lors de la soumission d'un formulaire,
236
+         * mais avant l'appel de la fonction de vérification.
237
+         */
238
+        pipeline(
239
+            'formulaire_receptionner',
240
+            [
241
+                'args' => ['form' => $form, 'args' => $args],
242
+                'data' => null,
243
+            ]
244
+        );
245 245
 
246
-		$verifier = charger_fonction('verifier', "formulaires/$form/", true);
247
-		$post["erreurs_$form"] = pipeline(
248
-			'formulaire_verifier',
249
-			[
250
-				'args' => ['form' => $form, 'args' => $args],
251
-				'data' => $verifier ? $verifier(...$args) : []
252
-			]
253
-		);
254
-		// prise en charge CVT multi etape si besoin
255
-		if (_request('cvtm_prev_post')) {
256
-			include_spip('inc/cvt_multietapes');
257
-			$post["erreurs_$form"] = cvtmulti_formulaire_verifier_etapes(
258
-				['form' => $form, 'args' => $args],
259
-				$post["erreurs_$form"]
260
-			);
261
-		}
246
+        $verifier = charger_fonction('verifier', "formulaires/$form/", true);
247
+        $post["erreurs_$form"] = pipeline(
248
+            'formulaire_verifier',
249
+            [
250
+                'args' => ['form' => $form, 'args' => $args],
251
+                'data' => $verifier ? $verifier(...$args) : []
252
+            ]
253
+        );
254
+        // prise en charge CVT multi etape si besoin
255
+        if (_request('cvtm_prev_post')) {
256
+            include_spip('inc/cvt_multietapes');
257
+            $post["erreurs_$form"] = cvtmulti_formulaire_verifier_etapes(
258
+                ['form' => $form, 'args' => $args],
259
+                $post["erreurs_$form"]
260
+            );
261
+        }
262 262
 
263
-		// accessibilite : si des erreurs mais pas de message general l'ajouter
264
-		if (isset($post["erreurs_$form"]) && (is_countable($post["erreurs_$form"]) ? count($post["erreurs_$form"]) : 0) && !isset($post["erreurs_$form"]['message_erreur'])) {
265
-			$post["erreurs_$form"]['message_erreur'] = singulier_ou_pluriel(
266
-				is_countable($post["erreurs_$form"]) ? count($post["erreurs_$form"]) : 0,
267
-				'avis_1_erreur_saisie',
268
-				'avis_nb_erreurs_saisie'
269
-			);
270
-		}
263
+        // accessibilite : si des erreurs mais pas de message general l'ajouter
264
+        if (isset($post["erreurs_$form"]) && (is_countable($post["erreurs_$form"]) ? count($post["erreurs_$form"]) : 0) && !isset($post["erreurs_$form"]['message_erreur'])) {
265
+            $post["erreurs_$form"]['message_erreur'] = singulier_ou_pluriel(
266
+                is_countable($post["erreurs_$form"]) ? count($post["erreurs_$form"]) : 0,
267
+                'avis_1_erreur_saisie',
268
+                'avis_nb_erreurs_saisie'
269
+            );
270
+        }
271 271
 
272
-		// si on ne demandait qu'une verif json
273
-		if (_request('formulaire_action_verifier_json')) {
274
-			include_spip('inc/json');
275
-			include_spip('inc/actions');
276
-			ajax_retour(json_encode($post["erreurs_$form"], JSON_THROW_ON_ERROR), 'text/plain');
272
+        // si on ne demandait qu'une verif json
273
+        if (_request('formulaire_action_verifier_json')) {
274
+            include_spip('inc/json');
275
+            include_spip('inc/actions');
276
+            ajax_retour(json_encode($post["erreurs_$form"], JSON_THROW_ON_ERROR), 'text/plain');
277 277
 
278
-			return true; // on a fini le hit
279
-		}
280
-		$retour = '';
281
-		if (isset($post["erreurs_$form"]) && (is_countable($post["erreurs_$form"]) ? count($post["erreurs_$form"]) : 0) == 0) {
282
-			$rev = '';
283
-			if ($traiter = charger_fonction('traiter', "formulaires/$form/", true)) {
284
-				$rev = $traiter(...$args);
285
-			}
278
+            return true; // on a fini le hit
279
+        }
280
+        $retour = '';
281
+        if (isset($post["erreurs_$form"]) && (is_countable($post["erreurs_$form"]) ? count($post["erreurs_$form"]) : 0) == 0) {
282
+            $rev = '';
283
+            if ($traiter = charger_fonction('traiter', "formulaires/$form/", true)) {
284
+                $rev = $traiter(...$args);
285
+            }
286 286
 
287
-			$rev = pipeline(
288
-				'formulaire_traiter',
289
-				[
290
-					'args' => ['form' => $form, 'args' => $args],
291
-					'data' => $rev
292
-				]
293
-			);
294
-			// le retour de traiter est
295
-			// un tableau explicite ('editable'=>$editable,'message_ok'=>$message,'redirect'=>$redirect,'id_xx'=>$id_xx)
296
-			// il permet le pipelinage, en particulier
297
-			// en y passant l'id de l'objet cree/modifie
298
-			// si message_erreur est present, on considere que le traitement a echoue
299
-			$post["message_ok_$form"] = '';
300
-			// on peut avoir message_ok et message_erreur
301
-			if (isset($rev['message_ok'])) {
302
-				$post["message_ok_$form"] = $rev['message_ok'];
303
-			}
287
+            $rev = pipeline(
288
+                'formulaire_traiter',
289
+                [
290
+                    'args' => ['form' => $form, 'args' => $args],
291
+                    'data' => $rev
292
+                ]
293
+            );
294
+            // le retour de traiter est
295
+            // un tableau explicite ('editable'=>$editable,'message_ok'=>$message,'redirect'=>$redirect,'id_xx'=>$id_xx)
296
+            // il permet le pipelinage, en particulier
297
+            // en y passant l'id de l'objet cree/modifie
298
+            // si message_erreur est present, on considere que le traitement a echoue
299
+            $post["message_ok_$form"] = '';
300
+            // on peut avoir message_ok et message_erreur
301
+            if (isset($rev['message_ok'])) {
302
+                $post["message_ok_$form"] = $rev['message_ok'];
303
+            }
304 304
 
305
-			// verifier si traiter n'a pas echoue avec une erreur :
306
-			if (isset($rev['message_erreur'])) {
307
-				$post["erreurs_$form"]['message_erreur'] = $rev['message_erreur'];
308
-				// si il y a une erreur on ne redirige pas
309
-			} else {
310
-				// sinon faire ce qu'il faut :
311
-				if (isset($rev['editable'])) {
312
-					$post["editable_$form"] = $rev['editable'];
313
-				}
314
-				// si une redirection est demandee, appeler redirigae_formulaire qui choisira
315
-				// le bon mode de redirection (302 et on ne revient pas ici, ou javascript et on continue)
316
-				if (isset($rev['redirect']) && $rev['redirect']) {
317
-					include_spip('inc/headers');
318
-					[$masque, $message] = redirige_formulaire($rev['redirect'], '', 'ajaxform');
319
-					$post["message_ok_$form"] .= $message;
320
-					$retour .= $masque;
321
-				}
322
-				// Si multiétape, puisqu'on a tout fait, on peut recommencer à zéro
323
-				if (_request('_etapes')) {
324
-					set_request('_etape', null);
325
-				}
326
-			}
327
-		}
328
-		// si le formulaire a ete soumis en ajax, on le renvoie direct !
329
-		if (_request('var_ajax')) {
330
-			if (find_in_path('formulaire_.php', 'balise/', true)) {
331
-				include_spip('inc/actions');
332
-				include_spip('public/assembler');
333
-				$retour .= inclure_balise_dynamique(balise_formulaire__dyn($form, ...$args), false);
334
-				// on ajoute un br en display none en tete du retour ajax pour regler un bug dans IE6/7
335
-				// sans cela le formulaire n'est pas actif apres le hit ajax
336
-				// la classe ajax-form-is-ok sert a s'assurer que le retour ajax s'est bien passe
337
-				$retour = "<br class='bugajaxie ajax-form-is-ok' style='display:none;'/>" . $retour;
338
-				ajax_retour($retour, false);
305
+            // verifier si traiter n'a pas echoue avec une erreur :
306
+            if (isset($rev['message_erreur'])) {
307
+                $post["erreurs_$form"]['message_erreur'] = $rev['message_erreur'];
308
+                // si il y a une erreur on ne redirige pas
309
+            } else {
310
+                // sinon faire ce qu'il faut :
311
+                if (isset($rev['editable'])) {
312
+                    $post["editable_$form"] = $rev['editable'];
313
+                }
314
+                // si une redirection est demandee, appeler redirigae_formulaire qui choisira
315
+                // le bon mode de redirection (302 et on ne revient pas ici, ou javascript et on continue)
316
+                if (isset($rev['redirect']) && $rev['redirect']) {
317
+                    include_spip('inc/headers');
318
+                    [$masque, $message] = redirige_formulaire($rev['redirect'], '', 'ajaxform');
319
+                    $post["message_ok_$form"] .= $message;
320
+                    $retour .= $masque;
321
+                }
322
+                // Si multiétape, puisqu'on a tout fait, on peut recommencer à zéro
323
+                if (_request('_etapes')) {
324
+                    set_request('_etape', null);
325
+                }
326
+            }
327
+        }
328
+        // si le formulaire a ete soumis en ajax, on le renvoie direct !
329
+        if (_request('var_ajax')) {
330
+            if (find_in_path('formulaire_.php', 'balise/', true)) {
331
+                include_spip('inc/actions');
332
+                include_spip('public/assembler');
333
+                $retour .= inclure_balise_dynamique(balise_formulaire__dyn($form, ...$args), false);
334
+                // on ajoute un br en display none en tete du retour ajax pour regler un bug dans IE6/7
335
+                // sans cela le formulaire n'est pas actif apres le hit ajax
336
+                // la classe ajax-form-is-ok sert a s'assurer que le retour ajax s'est bien passe
337
+                $retour = "<br class='bugajaxie ajax-form-is-ok' style='display:none;'/>" . $retour;
338
+                ajax_retour($retour, false);
339 339
 
340
-				return true; // on a fini le hit
341
-			}
342
-		}
343
-		// restaurer la lang en cours
344
-		changer_langue($old_lang);
345
-	}
340
+                return true; // on a fini le hit
341
+            }
342
+        }
343
+        // restaurer la lang en cours
344
+        changer_langue($old_lang);
345
+    }
346 346
 
347
-	return false; // le hit peut continuer normalement
347
+    return false; // le hit peut continuer normalement
348 348
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -32,7 +32,7 @@  discard block
 block discarded – undo
32 32
 	) {
33 33
 		// si l'url est une url du site, on la laisse passer sans rien faire
34 34
 		// c'est encore le plus simple
35
-		$base = $GLOBALS['meta']['adresse_site'] . '/';
35
+		$base = $GLOBALS['meta']['adresse_site'].'/';
36 36
 		if (strlen($base) && str_starts_with($redirect, $base)) {
37 37
 			return $redirect;
38 38
 		}
@@ -153,7 +153,7 @@  discard block
 block discarded – undo
153 153
 			if ($ancre = _request('var_ajax_ancre')) {
154 154
 				// pas n'importe quoi quand meme dans la variable !
155 155
 				$ancre = str_replace(['<', '"', "'"], ['&lt;', '&quot;', ''], $ancre);
156
-				$texte = "<a href='#$ancre' name='ajax_ancre' style='display:none;'>anchor</a>" . $texte;
156
+				$texte = "<a href='#$ancre' name='ajax_ancre' style='display:none;'>anchor</a>".$texte;
157 157
 			}
158 158
 		} else {
159 159
 			include_spip('inc/headers');
@@ -334,7 +334,7 @@  discard block
 block discarded – undo
334 334
 				// on ajoute un br en display none en tete du retour ajax pour regler un bug dans IE6/7
335 335
 				// sans cela le formulaire n'est pas actif apres le hit ajax
336 336
 				// la classe ajax-form-is-ok sert a s'assurer que le retour ajax s'est bien passe
337
-				$retour = "<br class='bugajaxie ajax-form-is-ok' style='display:none;'/>" . $retour;
337
+				$retour = "<br class='bugajaxie ajax-form-is-ok' style='display:none;'/>".$retour;
338 338
 				ajax_retour($retour, false);
339 339
 
340 340
 				return true; // on a fini le hit
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -204,8 +204,7 @@
 block discarded – undo
204 204
 			spip_logger('formulaires')->error("signature ajax form incorrecte : $form (formulaire signe mais ne correspond pas a la session)");
205 205
 			return false;
206 206
 		}
207
-	}
208
-	else {
207
+	} else {
209 208
 		if (!empty($sign)) {
210 209
 			spip_logger('formulaires')->error("signature ajax form incorrecte : $form (formulaire signe mais pas de session)");
211 210
 			return false;
Please login to merge, or discard this patch.
ecrire/public/balises.php 1 patch
Indentation   +943 added lines, -943 removed lines patch added patch discarded remove patch
@@ -27,7 +27,7 @@  discard block
 block discarded – undo
27 27
  **/
28 28
 
29 29
 if (!defined('_ECRIRE_INC_VERSION')) {
30
-	return;
30
+    return;
31 31
 }
32 32
 
33 33
 /**
@@ -47,16 +47,16 @@  discard block
 block discarded – undo
47 47
  *     Code PHP si cet argument est présent, sinon null
48 48
  **/
49 49
 function interprete_argument_balise(int $n, Champ $p): ?string {
50
-	if (($p->param) && (!$p->param[0][0]) && ((is_countable($p->param[0]) ? count($p->param[0]) : 0) > $n)) {
51
-		return calculer_liste(
52
-			$p->param[0][$n],
53
-			$p->descr,
54
-			$p->boucles,
55
-			$p->id_boucle
56
-		);
57
-	}
50
+    if (($p->param) && (!$p->param[0][0]) && ((is_countable($p->param[0]) ? count($p->param[0]) : 0) > $n)) {
51
+        return calculer_liste(
52
+            $p->param[0][$n],
53
+            $p->descr,
54
+            $p->boucles,
55
+            $p->id_boucle
56
+        );
57
+    }
58 58
 
59
-	return null;
59
+    return null;
60 60
 }
61 61
 
62 62
 
@@ -76,10 +76,10 @@  discard block
 block discarded – undo
76 76
  *     Pile complétée par le code à générer
77 77
  **/
78 78
 function balise_NOM_SITE_SPIP_dist($p) {
79
-	$p->code = "\$GLOBALS['meta']['nom_site']";
79
+    $p->code = "\$GLOBALS['meta']['nom_site']";
80 80
 
81
-	#$p->interdire_scripts = true;
82
-	return $p;
81
+    #$p->interdire_scripts = true;
82
+    return $p;
83 83
 }
84 84
 
85 85
 /**
@@ -95,10 +95,10 @@  discard block
 block discarded – undo
95 95
  *     Pile complétée par le code à générer
96 96
  **/
97 97
 function balise_EMAIL_WEBMASTER_dist($p) {
98
-	$p->code = "\$GLOBALS['meta']['email_webmaster']";
98
+    $p->code = "\$GLOBALS['meta']['email_webmaster']";
99 99
 
100
-	#$p->interdire_scripts = true;
101
-	return $p;
100
+    #$p->interdire_scripts = true;
101
+    return $p;
102 102
 }
103 103
 
104 104
 /**
@@ -114,10 +114,10 @@  discard block
 block discarded – undo
114 114
  *     Pile complétée par le code à générer
115 115
  **/
116 116
 function balise_DESCRIPTIF_SITE_SPIP_dist($p) {
117
-	$p->code = "\$GLOBALS['meta']['descriptif_site']";
117
+    $p->code = "\$GLOBALS['meta']['descriptif_site']";
118 118
 
119
-	#$p->interdire_scripts = true;
120
-	return $p;
119
+    #$p->interdire_scripts = true;
120
+    return $p;
121 121
 }
122 122
 
123 123
 
@@ -138,10 +138,10 @@  discard block
 block discarded – undo
138 138
  *     Pile complétée par le code à générer
139 139
  **/
140 140
 function balise_CHARSET_dist($p) {
141
-	$p->code = "\$GLOBALS['meta']['charset']";
141
+    $p->code = "\$GLOBALS['meta']['charset']";
142 142
 
143
-	#$p->interdire_scripts = true;
144
-	return $p;
143
+    #$p->interdire_scripts = true;
144
+    return $p;
145 145
 }
146 146
 
147 147
 /**
@@ -166,11 +166,11 @@  discard block
 block discarded – undo
166 166
  *     Pile complétée par le code à générer
167 167
  **/
168 168
 function balise_LANG_LEFT_dist($p) {
169
-	$_lang = champ_sql('lang', $p);
170
-	$p->code = "lang_dir($_lang, 'left','right')";
171
-	$p->interdire_scripts = false;
169
+    $_lang = champ_sql('lang', $p);
170
+    $p->code = "lang_dir($_lang, 'left','right')";
171
+    $p->interdire_scripts = false;
172 172
 
173
-	return $p;
173
+    return $p;
174 174
 }
175 175
 
176 176
 /**
@@ -190,11 +190,11 @@  discard block
 block discarded – undo
190 190
  *     Pile complétée par le code à générer
191 191
  **/
192 192
 function balise_LANG_RIGHT_dist($p) {
193
-	$_lang = champ_sql('lang', $p);
194
-	$p->code = "lang_dir($_lang, 'right','left')";
195
-	$p->interdire_scripts = false;
193
+    $_lang = champ_sql('lang', $p);
194
+    $p->code = "lang_dir($_lang, 'right','left')";
195
+    $p->interdire_scripts = false;
196 196
 
197
-	return $p;
197
+    return $p;
198 198
 }
199 199
 
200 200
 /**
@@ -219,11 +219,11 @@  discard block
 block discarded – undo
219 219
  *     Pile complétée par le code à générer
220 220
  **/
221 221
 function balise_LANG_DIR_dist($p) {
222
-	$_lang = champ_sql('lang', $p);
223
-	$p->code = "lang_dir($_lang, 'ltr','rtl')";
224
-	$p->interdire_scripts = false;
222
+    $_lang = champ_sql('lang', $p);
223
+    $p->code = "lang_dir($_lang, 'ltr','rtl')";
224
+    $p->interdire_scripts = false;
225 225
 
226
-	return $p;
226
+    return $p;
227 227
 }
228 228
 
229 229
 
@@ -240,10 +240,10 @@  discard block
 block discarded – undo
240 240
  *     Pile complétée par le code à générer
241 241
  **/
242 242
 function balise_PUCE_dist($p) {
243
-	$p->code = 'definir_puce()';
244
-	$p->interdire_scripts = false;
243
+    $p->code = 'definir_puce()';
244
+    $p->interdire_scripts = false;
245 245
 
246
-	return $p;
246
+    return $p;
247 247
 }
248 248
 
249 249
 
@@ -267,9 +267,9 @@  discard block
 block discarded – undo
267 267
  *     Pile completée du code PHP d'exécution de la balise
268 268
  */
269 269
 function balise_DATE_dist($p) {
270
-	$p->code = champ_sql('date', $p);
270
+    $p->code = champ_sql('date', $p);
271 271
 
272
-	return $p;
272
+    return $p;
273 273
 }
274 274
 
275 275
 
@@ -289,10 +289,10 @@  discard block
 block discarded – undo
289 289
  *     Pile completée du code PHP d'exécution de la balise
290 290
  */
291 291
 function balise_DATE_REDAC_dist($p) {
292
-	$p->code = champ_sql('date_redac', $p);
293
-	$p->interdire_scripts = false;
292
+    $p->code = champ_sql('date_redac', $p);
293
+    $p->interdire_scripts = false;
294 294
 
295
-	return $p;
295
+    return $p;
296 296
 }
297 297
 
298 298
 /**
@@ -311,10 +311,10 @@  discard block
 block discarded – undo
311 311
  *     Pile completée du code PHP d'exécution de la balise
312 312
  */
313 313
 function balise_DATE_MODIF_dist($p) {
314
-	$p->code = champ_sql('date_modif', $p);
315
-	$p->interdire_scripts = false;
314
+    $p->code = champ_sql('date_modif', $p);
315
+    $p->interdire_scripts = false;
316 316
 
317
-	return $p;
317
+    return $p;
318 318
 }
319 319
 
320 320
 /**
@@ -332,13 +332,13 @@  discard block
 block discarded – undo
332 332
  *     Pile completée du code PHP d'exécution de la balise
333 333
  */
334 334
 function balise_DATE_NOUVEAUTES_dist($p) {
335
-	$p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
335
+    $p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
336 336
 	AND isset(\$GLOBALS['meta']['dernier_envoi_neuf'])) ?
337 337
 	\$GLOBALS['meta']['dernier_envoi_neuf'] :
338 338
 	\"'0000-00-00'\")";
339
-	$p->interdire_scripts = false;
339
+    $p->interdire_scripts = false;
340 340
 
341
-	return $p;
341
+    return $p;
342 342
 }
343 343
 
344 344
 
@@ -356,11 +356,11 @@  discard block
 block discarded – undo
356 356
  *     Pile completée du code PHP d'exécution de la balise
357 357
  */
358 358
 function balise_DOSSIER_SQUELETTE_dist($p) {
359
-	$code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
360
-	$p->code = "_DIR_RACINE . '$code'" .
361
-		$p->interdire_scripts = false;
359
+    $code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
360
+    $p->code = "_DIR_RACINE . '$code'" .
361
+        $p->interdire_scripts = false;
362 362
 
363
-	return $p;
363
+    return $p;
364 364
 }
365 365
 
366 366
 /**
@@ -375,11 +375,11 @@  discard block
 block discarded – undo
375 375
  *     Pile completée du code PHP d'exécution de la balise
376 376
  */
377 377
 function balise_SQUELETTE_dist($p) {
378
-	$code = addslashes($p->descr['sourcefile']);
379
-	$p->code = "'$code'" .
380
-		$p->interdire_scripts = false;
378
+    $code = addslashes($p->descr['sourcefile']);
379
+    $p->code = "'$code'" .
380
+        $p->interdire_scripts = false;
381 381
 
382
-	return $p;
382
+    return $p;
383 383
 }
384 384
 
385 385
 /**
@@ -398,10 +398,10 @@  discard block
 block discarded – undo
398 398
  *     Pile completée du code PHP d'exécution de la balise
399 399
  */
400 400
 function balise_SPIP_VERSION_dist($p) {
401
-	$p->code = 'spip_version()';
402
-	$p->interdire_scripts = false;
401
+    $p->code = 'spip_version()';
402
+    $p->interdire_scripts = false;
403 403
 
404
-	return $p;
404
+    return $p;
405 405
 }
406 406
 
407 407
 
@@ -427,18 +427,18 @@  discard block
 block discarded – undo
427 427
  *     Pile complétée par le code à générer
428 428
  **/
429 429
 function balise_NOM_SITE_dist($p) {
430
-	if (!$p->etoile) {
431
-		$p->code = 'supprimer_numero(calculer_url(' .
432
-			champ_sql('url_site', $p) . ',' .
433
-			champ_sql('nom_site', $p) .
434
-			", 'titre', \$connect, false))";
435
-	} else {
436
-		$p->code = champ_sql('nom_site', $p);
437
-	}
430
+    if (!$p->etoile) {
431
+        $p->code = 'supprimer_numero(calculer_url(' .
432
+            champ_sql('url_site', $p) . ',' .
433
+            champ_sql('nom_site', $p) .
434
+            ", 'titre', \$connect, false))";
435
+    } else {
436
+        $p->code = champ_sql('nom_site', $p);
437
+    }
438 438
 
439
-	$p->interdire_scripts = true;
439
+    $p->interdire_scripts = true;
440 440
 
441
-	return $p;
441
+    return $p;
442 442
 }
443 443
 
444 444
 
@@ -455,11 +455,11 @@  discard block
 block discarded – undo
455 455
  *     Pile complétée par le code à générer
456 456
  **/
457 457
 function balise_NOTES_dist($p) {
458
-	// Recuperer les notes
459
-	$p->code = 'calculer_notes()';
458
+    // Recuperer les notes
459
+    $p->code = 'calculer_notes()';
460 460
 
461
-	#$p->interdire_scripts = true;
462
-	return $p;
461
+    #$p->interdire_scripts = true;
462
+    return $p;
463 463
 }
464 464
 
465 465
 
@@ -481,10 +481,10 @@  discard block
 block discarded – undo
481 481
  *     Pile complétée par le code à générer
482 482
  **/
483 483
 function balise_RECHERCHE_dist($p) {
484
-	$p->code = 'entites_html(_request("recherche"))';
485
-	$p->interdire_scripts = false;
484
+    $p->code = 'entites_html(_request("recherche"))';
485
+    $p->interdire_scripts = false;
486 486
 
487
-	return $p;
487
+    return $p;
488 488
 }
489 489
 
490 490
 
@@ -502,18 +502,18 @@  discard block
 block discarded – undo
502 502
  *     Pile complétée par le code à générer
503 503
  **/
504 504
 function balise_COMPTEUR_BOUCLE_dist($p) {
505
-	$b = index_boucle_mere($p);
506
-	if ($b === '') {
507
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
508
-		erreur_squelette($msg, $p);
509
-		return null;
510
-	} else {
511
-		$p->code = "(\$Numrows['$b']['compteur_boucle'] ?? 0)";
512
-		$p->boucles[$b]->cptrows = true;
513
-		$p->interdire_scripts = false;
505
+    $b = index_boucle_mere($p);
506
+    if ($b === '') {
507
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
508
+        erreur_squelette($msg, $p);
509
+        return null;
510
+    } else {
511
+        $p->code = "(\$Numrows['$b']['compteur_boucle'] ?? 0)";
512
+        $p->boucles[$b]->cptrows = true;
513
+        $p->interdire_scripts = false;
514 514
 
515
-		return $p;
516
-	}
515
+        return $p;
516
+    }
517 517
 }
518 518
 
519 519
 /**
@@ -531,17 +531,17 @@  discard block
 block discarded – undo
531 531
  *     Pile complétée par le code à générer
532 532
  **/
533 533
 function balise_TOTAL_BOUCLE_dist($p) {
534
-	$b = index_boucle_mere($p);
535
-	if ($b === '') {
536
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
537
-		erreur_squelette($msg, $p);
538
-	} else {
539
-		$p->code = "(\$Numrows['$b']['total'] ?? 0)";
540
-		$p->boucles[$b]->numrows = true;
541
-		$p->interdire_scripts = false;
542
-	}
534
+    $b = index_boucle_mere($p);
535
+    if ($b === '') {
536
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
537
+        erreur_squelette($msg, $p);
538
+    } else {
539
+        $p->code = "(\$Numrows['$b']['total'] ?? 0)";
540
+        $p->boucles[$b]->numrows = true;
541
+        $p->interdire_scripts = false;
542
+    }
543 543
 
544
-	return $p;
544
+    return $p;
545 545
 }
546 546
 
547 547
 
@@ -561,7 +561,7 @@  discard block
 block discarded – undo
561 561
  *     Pile complétée par le code à générer
562 562
  **/
563 563
 function balise_POINTS_dist($p) {
564
-	return rindex_pile($p, 'points', 'recherche');
564
+    return rindex_pile($p, 'points', 'recherche');
565 565
 }
566 566
 
567 567
 
@@ -582,12 +582,12 @@  discard block
 block discarded – undo
582 582
  *     Pile complétée par le code à générer
583 583
  **/
584 584
 function balise_POPULARITE_ABSOLUE_dist($p) {
585
-	$p->code = 'ceil(' .
586
-		champ_sql('popularite', $p) .
587
-		')';
588
-	$p->interdire_scripts = false;
585
+    $p->code = 'ceil(' .
586
+        champ_sql('popularite', $p) .
587
+        ')';
588
+    $p->interdire_scripts = false;
589 589
 
590
-	return $p;
590
+    return $p;
591 591
 }
592 592
 
593 593
 /**
@@ -607,10 +607,10 @@  discard block
 block discarded – undo
607 607
  *     Pile complétée par le code à générer
608 608
  **/
609 609
 function balise_POPULARITE_SITE_dist($p) {
610
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
611
-	$p->interdire_scripts = false;
610
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
611
+    $p->interdire_scripts = false;
612 612
 
613
-	return $p;
613
+    return $p;
614 614
 }
615 615
 
616 616
 /**
@@ -631,10 +631,10 @@  discard block
 block discarded – undo
631 631
  *     Pile complétée par le code à générer
632 632
  **/
633 633
 function balise_POPULARITE_MAX_dist($p) {
634
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
635
-	$p->interdire_scripts = false;
634
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
635
+    $p->interdire_scripts = false;
636 636
 
637
-	return $p;
637
+    return $p;
638 638
 }
639 639
 
640 640
 
@@ -660,15 +660,15 @@  discard block
 block discarded – undo
660 660
  *     Pile complétée par le code à générer
661 661
  **/
662 662
 function balise_VALEUR_dist($p) {
663
-	$b = $p->nom_boucle ?: $p->id_boucle;
664
-	$p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);
663
+    $b = $p->nom_boucle ?: $p->id_boucle;
664
+    $p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);
665 665
 ;
666
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
667
-		$p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
668
-	}
669
-	$p->interdire_scripts = true;
666
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
667
+        $p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
668
+    }
669
+    $p->interdire_scripts = true;
670 670
 
671
-	return $p;
671
+    return $p;
672 672
 }
673 673
 
674 674
 /**
@@ -697,16 +697,16 @@  discard block
 block discarded – undo
697 697
  *     Pile complétée par le code à générer
698 698
  **/
699 699
 function balise_EXPOSE_dist($p) {
700
-	$on = "'on'";
701
-	$off = "''";
702
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
703
-		$on = $v;
704
-		if (($v = interprete_argument_balise(2, $p)) !== null) {
705
-			$off = $v;
706
-		}
707
-	}
700
+    $on = "'on'";
701
+    $off = "''";
702
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
703
+        $on = $v;
704
+        if (($v = interprete_argument_balise(2, $p)) !== null) {
705
+            $off = $v;
706
+        }
707
+    }
708 708
 
709
-	return calculer_balise_expose($p, $on, $off);
709
+    return calculer_balise_expose($p, $on, $off);
710 710
 }
711 711
 
712 712
 /**
@@ -724,35 +724,35 @@  discard block
 block discarded – undo
724 724
  *     Pile complétée par le code à générer
725 725
  **/
726 726
 function calculer_balise_expose($p, $on, $off) {
727
-	$b = index_boucle($p);
728
-	if (empty($p->boucles[$b]->primary)) {
729
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
730
-		erreur_squelette($msg, $p);
731
-	} else {
732
-		$key = $p->boucles[$b]->primary;
733
-		$type = $p->boucles[$p->id_boucle]->primary;
734
-		$desc = $p->boucles[$b]->show;
735
-		$connect = sql_quote($p->boucles[$b]->sql_serveur);
727
+    $b = index_boucle($p);
728
+    if (empty($p->boucles[$b]->primary)) {
729
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
730
+        erreur_squelette($msg, $p);
731
+    } else {
732
+        $key = $p->boucles[$b]->primary;
733
+        $type = $p->boucles[$p->id_boucle]->primary;
734
+        $desc = $p->boucles[$b]->show;
735
+        $connect = sql_quote($p->boucles[$b]->sql_serveur);
736 736
 
737
-		// Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
738
-		$c = index_pile($p->id_boucle, $type, $p->boucles);
737
+        // Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
738
+        $c = index_pile($p->id_boucle, $type, $p->boucles);
739 739
 
740
-		if (isset($desc['field']['id_parent'])) {
741
-			$parent = 0; // pour if (!$parent) dans calculer_expose
742
-		} elseif (isset($desc['field']['id_rubrique'])) {
743
-			$parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
744
-		} elseif (isset($desc['field']['id_groupe'])) {
745
-			$parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
746
-		} else {
747
-			$parent = "''";
748
-		}
740
+        if (isset($desc['field']['id_parent'])) {
741
+            $parent = 0; // pour if (!$parent) dans calculer_expose
742
+        } elseif (isset($desc['field']['id_rubrique'])) {
743
+            $parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
744
+        } elseif (isset($desc['field']['id_groupe'])) {
745
+            $parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
746
+        } else {
747
+            $parent = "''";
748
+        }
749 749
 
750
-		$p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
751
-	}
750
+        $p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
751
+    }
752 752
 
753
-	$p->interdire_scripts = false;
753
+    $p->interdire_scripts = false;
754 754
 
755
-	return $p;
755
+    return $p;
756 756
 }
757 757
 
758 758
 
@@ -793,46 +793,46 @@  discard block
 block discarded – undo
793 793
  **/
794 794
 function balise_INTRODUCTION_dist($p) {
795 795
 
796
-	$type_objet = $p->type_requete;
797
-	$cle_objet = id_table_objet($type_objet);
798
-	$_id_objet = champ_sql($cle_objet, $p);
799
-
800
-	// Récupérer les valeurs sql nécessaires : descriptif, texte et chapo
801
-	// ainsi que le longueur d'introduction donnée dans la description de l'objet.
802
-	$_introduction_longueur = 'null';
803
-	$_ligne = 'array(';
804
-	$trouver_table = charger_fonction('trouver_table', 'base');
805
-	if ($desc = $trouver_table(table_objet_sql($type_objet))) {
806
-		if (isset($desc['field']['descriptif'])) {
807
-			$_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
808
-		}
809
-		if (isset($desc['field']['texte'])) {
810
-			$_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
811
-		}
812
-		if (isset($desc['field']['chapo'])) {
813
-			$_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
814
-		}
815
-		if (isset($desc['introduction_longueur'])) {
816
-			$_introduction_longueur = "'" . $desc['introduction_longueur'] . "'";
817
-		}
818
-	}
819
-	$_ligne .= ')';
820
-
821
-	// Récupérer la longueur et la suite passés en paramètres
822
-	$_longueur_ou_suite = 'null';
823
-	if (($v1 = interprete_argument_balise(1, $p)) !== null) {
824
-		$_longueur_ou_suite = $v1;
825
-	}
826
-	$_suite = 'null';
827
-	if (($v2 = interprete_argument_balise(2, $p)) !== null) {
828
-		$_suite = $v2;
829
-	}
830
-
831
-	$p->code = "generer_objet_introduction((int)$_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)";
832
-
833
-	#$p->interdire_scripts = true;
834
-	$p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
835
-	return $p;
796
+    $type_objet = $p->type_requete;
797
+    $cle_objet = id_table_objet($type_objet);
798
+    $_id_objet = champ_sql($cle_objet, $p);
799
+
800
+    // Récupérer les valeurs sql nécessaires : descriptif, texte et chapo
801
+    // ainsi que le longueur d'introduction donnée dans la description de l'objet.
802
+    $_introduction_longueur = 'null';
803
+    $_ligne = 'array(';
804
+    $trouver_table = charger_fonction('trouver_table', 'base');
805
+    if ($desc = $trouver_table(table_objet_sql($type_objet))) {
806
+        if (isset($desc['field']['descriptif'])) {
807
+            $_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
808
+        }
809
+        if (isset($desc['field']['texte'])) {
810
+            $_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
811
+        }
812
+        if (isset($desc['field']['chapo'])) {
813
+            $_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
814
+        }
815
+        if (isset($desc['introduction_longueur'])) {
816
+            $_introduction_longueur = "'" . $desc['introduction_longueur'] . "'";
817
+        }
818
+    }
819
+    $_ligne .= ')';
820
+
821
+    // Récupérer la longueur et la suite passés en paramètres
822
+    $_longueur_ou_suite = 'null';
823
+    if (($v1 = interprete_argument_balise(1, $p)) !== null) {
824
+        $_longueur_ou_suite = $v1;
825
+    }
826
+    $_suite = 'null';
827
+    if (($v2 = interprete_argument_balise(2, $p)) !== null) {
828
+        $_suite = $v2;
829
+    }
830
+
831
+    $p->code = "generer_objet_introduction((int)$_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)";
832
+
833
+    #$p->interdire_scripts = true;
834
+    $p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
835
+    return $p;
836 836
 }
837 837
 
838 838
 
@@ -852,15 +852,15 @@  discard block
 block discarded – undo
852 852
  *     Pile complétée par le code à générer
853 853
  **/
854 854
 function balise_LANG_dist($p) {
855
-	$_lang = champ_sql('lang', $p);
856
-	if (!$p->etoile) {
857
-		$p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
858
-	} else {
859
-		$p->code = "spip_htmlentities($_lang)";
860
-	}
861
-	$p->interdire_scripts = false;
855
+    $_lang = champ_sql('lang', $p);
856
+    if (!$p->etoile) {
857
+        $p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
858
+    } else {
859
+        $p->code = "spip_htmlentities($_lang)";
860
+    }
861
+    $p->interdire_scripts = false;
862 862
 
863
-	return $p;
863
+    return $p;
864 864
 }
865 865
 
866 866
 /**
@@ -882,45 +882,45 @@  discard block
 block discarded – undo
882 882
  *     Pile complétée par le code à générer
883 883
  */
884 884
 function balise_LESAUTEURS_dist($p) {
885
-	// Cherche le champ 'lesauteurs' dans la pile
886
-	$_lesauteurs = champ_sql('lesauteurs', $p, '');
887
-
888
-	// Si le champ n'existe pas (cas de spip_articles), on applique
889
-	// le modele lesauteurs.html en passant id_article dans le contexte;
890
-	// dans le cas contraire on prend le champ 'lesauteurs'
891
-	// (cf extension sites/)
892
-	if ($_lesauteurs) {
893
-		$p->code = "safehtml($_lesauteurs)";
894
-		// $p->interdire_scripts = true;
895
-	} else {
896
-		if (!$p->id_boucle) {
897
-			$connect = '';
898
-			$objet = 'article';
899
-			$id_table_objet = 'id_article';
900
-		} else {
901
-			$b = $p->nom_boucle ?: $p->id_boucle;
902
-			$connect = $p->boucles[$b]->sql_serveur;
903
-			$type_boucle = $p->boucles[$b]->type_requete;
904
-			$objet = objet_type($type_boucle);
905
-			$id_table_objet = id_table_objet($type_boucle);
906
-		}
907
-		$c = memoriser_contexte_compil($p);
908
-
909
-		$p->code = sprintf(
910
-			CODE_RECUPERER_FOND,
911
-			"'modeles/lesauteurs'",
912
-			"array('objet'=>'" . $objet .
913
-			"','id_objet' => " . champ_sql($id_table_objet, $p) .
914
-			",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
915
-			($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) .
916
-			')',
917
-			"'trim'=>true, 'compil'=>array($c)",
918
-			_q($connect)
919
-		);
920
-		$p->interdire_scripts = false; // securite apposee par recuperer_fond()
921
-	}
922
-
923
-	return $p;
885
+    // Cherche le champ 'lesauteurs' dans la pile
886
+    $_lesauteurs = champ_sql('lesauteurs', $p, '');
887
+
888
+    // Si le champ n'existe pas (cas de spip_articles), on applique
889
+    // le modele lesauteurs.html en passant id_article dans le contexte;
890
+    // dans le cas contraire on prend le champ 'lesauteurs'
891
+    // (cf extension sites/)
892
+    if ($_lesauteurs) {
893
+        $p->code = "safehtml($_lesauteurs)";
894
+        // $p->interdire_scripts = true;
895
+    } else {
896
+        if (!$p->id_boucle) {
897
+            $connect = '';
898
+            $objet = 'article';
899
+            $id_table_objet = 'id_article';
900
+        } else {
901
+            $b = $p->nom_boucle ?: $p->id_boucle;
902
+            $connect = $p->boucles[$b]->sql_serveur;
903
+            $type_boucle = $p->boucles[$b]->type_requete;
904
+            $objet = objet_type($type_boucle);
905
+            $id_table_objet = id_table_objet($type_boucle);
906
+        }
907
+        $c = memoriser_contexte_compil($p);
908
+
909
+        $p->code = sprintf(
910
+            CODE_RECUPERER_FOND,
911
+            "'modeles/lesauteurs'",
912
+            "array('objet'=>'" . $objet .
913
+            "','id_objet' => " . champ_sql($id_table_objet, $p) .
914
+            ",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
915
+            ($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) .
916
+            ')',
917
+            "'trim'=>true, 'compil'=>array($c)",
918
+            _q($connect)
919
+        );
920
+        $p->interdire_scripts = false; // securite apposee par recuperer_fond()
921
+    }
922
+
923
+    return $p;
924 924
 }
925 925
 
926 926
 
@@ -947,76 +947,76 @@  discard block
 block discarded – undo
947 947
  *     Pile complétée par le code à générer
948 948
  */
949 949
 function balise_RANG_dist($p) {
950
-	$b = index_boucle($p);
951
-	if ($b === '') {
952
-		$msg = [
953
-			'zbug_champ_hors_boucle',
954
-			['champ' => '#RANG']
955
-		];
956
-		erreur_squelette($msg, $p);
957
-	} else {
958
-		// chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
959
-		// dans la boucle immediatement englobante uniquement
960
-		// sinon on compose le champ calcule
961
-		$_rang = champ_sql('rang', $p, '', false);
962
-
963
-		// si pas trouve de champ sql rang :
964
-		if (!$_rang || $_rang == "''") {
965
-			$boucle = &$p->boucles[$b];
966
-
967
-			// on gere le cas ou #RANG est une extraction du numero dans le titre
968
-			$trouver_table = charger_fonction('trouver_table', 'base');
969
-			$desc = $trouver_table($boucle->id_table);
970
-			$_titre = ''; # où extraire le numero ?
971
-
972
-			if (isset($desc['titre'])) {
973
-				$t = $desc['titre'];
974
-				if (
975
-					// Soit on trouve avec la déclaration de la lang AVANT
976
-					preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
977
-					// Soit on prend depuis le début
978
-					|| preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
979
-				) {
980
-					$m = preg_replace(',as\s+titre$,i', '', $m[1]);
981
-					$m = trim($m);
982
-					if ($m != "''") {
983
-						if (!preg_match(',\W,', $m)) {
984
-							$m = $boucle->id_table . ".$m";
985
-						}
986
-
987
-						$m .= ' AS titre_rang';
988
-
989
-						$boucle->select[] = $m;
990
-						$_titre = '$Pile[$SP][\'titre_rang\']';
991
-					}
992
-				}
993
-			}
994
-
995
-			// si on n'a rien trouvé, on utilise le champ titre classique
996
-			if (!$_titre) {
997
-				$_titre = champ_sql('titre', $p);
998
-			}
999
-
1000
-			// et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1001
-			// cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1002
-			$type_boucle = $boucle->type_requete;
1003
-			$objet = objet_type($type_boucle);
1004
-			$id_table_objet = id_table_objet($type_boucle);
1005
-			$_primary = champ_sql($id_table_objet, $p, '', false);
1006
-			$_env = '$Pile[0]';
1007
-
1008
-			if (!$_titre) {$_titre = "''";
1009
-			}
1010
-			if (!$_primary) {$_primary = "''";
1011
-			}
1012
-			$_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1013
-		}
1014
-
1015
-		$p->code = $_rang;
1016
-		$p->interdire_scripts = false;
1017
-	}
1018
-
1019
-	return $p;
950
+    $b = index_boucle($p);
951
+    if ($b === '') {
952
+        $msg = [
953
+            'zbug_champ_hors_boucle',
954
+            ['champ' => '#RANG']
955
+        ];
956
+        erreur_squelette($msg, $p);
957
+    } else {
958
+        // chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
959
+        // dans la boucle immediatement englobante uniquement
960
+        // sinon on compose le champ calcule
961
+        $_rang = champ_sql('rang', $p, '', false);
962
+
963
+        // si pas trouve de champ sql rang :
964
+        if (!$_rang || $_rang == "''") {
965
+            $boucle = &$p->boucles[$b];
966
+
967
+            // on gere le cas ou #RANG est une extraction du numero dans le titre
968
+            $trouver_table = charger_fonction('trouver_table', 'base');
969
+            $desc = $trouver_table($boucle->id_table);
970
+            $_titre = ''; # où extraire le numero ?
971
+
972
+            if (isset($desc['titre'])) {
973
+                $t = $desc['titre'];
974
+                if (
975
+                    // Soit on trouve avec la déclaration de la lang AVANT
976
+                    preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
977
+                    // Soit on prend depuis le début
978
+                    || preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
979
+                ) {
980
+                    $m = preg_replace(',as\s+titre$,i', '', $m[1]);
981
+                    $m = trim($m);
982
+                    if ($m != "''") {
983
+                        if (!preg_match(',\W,', $m)) {
984
+                            $m = $boucle->id_table . ".$m";
985
+                        }
986
+
987
+                        $m .= ' AS titre_rang';
988
+
989
+                        $boucle->select[] = $m;
990
+                        $_titre = '$Pile[$SP][\'titre_rang\']';
991
+                    }
992
+                }
993
+            }
994
+
995
+            // si on n'a rien trouvé, on utilise le champ titre classique
996
+            if (!$_titre) {
997
+                $_titre = champ_sql('titre', $p);
998
+            }
999
+
1000
+            // et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1001
+            // cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1002
+            $type_boucle = $boucle->type_requete;
1003
+            $objet = objet_type($type_boucle);
1004
+            $id_table_objet = id_table_objet($type_boucle);
1005
+            $_primary = champ_sql($id_table_objet, $p, '', false);
1006
+            $_env = '$Pile[0]';
1007
+
1008
+            if (!$_titre) {$_titre = "''";
1009
+            }
1010
+            if (!$_primary) {$_primary = "''";
1011
+            }
1012
+            $_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1013
+        }
1014
+
1015
+        $p->code = $_rang;
1016
+        $p->interdire_scripts = false;
1017
+    }
1018
+
1019
+    return $p;
1020 1020
 }
1021 1021
 
1022 1022
 
@@ -1038,12 +1038,12 @@  discard block
 block discarded – undo
1038 1038
  *     Pile complétée par le code à générer
1039 1039
  **/
1040 1040
 function balise_POPULARITE_dist($p) {
1041
-	$_popularite = champ_sql('popularite', $p);
1042
-	$p->code = "(ceil(min(100, 100 * $_popularite
1041
+    $_popularite = champ_sql('popularite', $p);
1042
+    $p->code = "(ceil(min(100, 100 * $_popularite
1043 1043
 	/ max(1 , 0 + \$GLOBALS['meta']['popularite_max']))))";
1044
-	$p->interdire_scripts = false;
1044
+    $p->interdire_scripts = false;
1045 1045
 
1046
-	return $p;
1046
+    return $p;
1047 1047
 }
1048 1048
 
1049 1049
 /**
@@ -1054,8 +1054,8 @@  discard block
 block discarded – undo
1054 1054
  * l'absence peut-être due à une faute de frappe dans le contexte inclus.
1055 1055
  */
1056 1056
 define(
1057
-	'CODE_PAGINATION',
1058
-	'%s($Numrows["%s"]["grand_total"],
1057
+    'CODE_PAGINATION',
1058
+    '%s($Numrows["%s"]["grand_total"],
1059 1059
  		%s,
1060 1060
 		isset($Pile[0][%4$s])?$Pile[0][%4$s]:intval(_request(%4$s)),
1061 1061
 		%5$s, %6$s, %7$s, %8$s, array(%9$s))'
@@ -1092,75 +1092,75 @@  discard block
 block discarded – undo
1092 1092
  *     Pile complétée par le code à générer
1093 1093
  */
1094 1094
 function balise_PAGINATION_dist($p, $liste = 'true') {
1095
-	$b = index_boucle_mere($p);
1096
-
1097
-	// s'il n'y a pas de nom de boucle, on ne peut pas paginer
1098
-	if ($b === '') {
1099
-		$msg = [
1100
-			'zbug_champ_hors_boucle',
1101
-			['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION']
1102
-		];
1103
-		erreur_squelette($msg, $p);
1104
-
1105
-		return $p;
1106
-	}
1107
-
1108
-	// s'il n'y a pas de mode_partie, c'est qu'on se trouve
1109
-	// dans un boucle recursive ou qu'on a oublie le critere {pagination}
1110
-	if (!$p->boucles[$b]->mode_partie) {
1111
-		if (!$p->boucles[$b]->table_optionnelle) {
1112
-			$msg = [
1113
-				'zbug_pagination_sans_critere',
1114
-				['champ' => '#PAGINATION']
1115
-			];
1116
-			erreur_squelette($msg, $p);
1117
-		}
1118
-
1119
-		return $p;
1120
-	}
1121
-
1122
-	// a priori true
1123
-	// si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1124
-	// si true, les arguments simples (sans truc=chose) vont degager
1125
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1126
-	if (is_countable($_contexte) ? count($_contexte) : 0) {
1127
-		$key = key($_contexte);
1128
-		if (is_numeric($key)) {
1129
-			array_shift($_contexte);
1130
-			$__modele = interprete_argument_balise(1, $p);
1131
-		}
1132
-	}
1133
-
1134
-	if (is_countable($_contexte) ? count($_contexte) : 0) {
1135
-		$code_contexte = implode(',', $_contexte);
1136
-	} else {
1137
-		$code_contexte = '';
1138
-	}
1139
-
1140
-	$connect = $p->boucles[$b]->sql_serveur;
1141
-	$pas = $p->boucles[$b]->total_parties;
1142
-	$f_pagination = chercher_filtre('pagination');
1143
-	$type = $p->boucles[$b]->modificateur['debut_nom'];
1144
-	$modif = ($type[0] !== "'") ? "'debut'.$type"
1145
-		: ("'debut" . substr($type, 1));
1146
-
1147
-	$p->code = sprintf(
1148
-		CODE_PAGINATION,
1149
-		$f_pagination,
1150
-		$b,
1151
-		$type,
1152
-		$modif,
1153
-		$pas,
1154
-		$liste,
1155
-		((isset($__modele) && $__modele) ? $__modele : "''"),
1156
-		_q($connect),
1157
-		$code_contexte
1158
-	);
1159
-
1160
-	$p->boucles[$b]->numrows = true;
1161
-	$p->interdire_scripts = false;
1162
-
1163
-	return $p;
1095
+    $b = index_boucle_mere($p);
1096
+
1097
+    // s'il n'y a pas de nom de boucle, on ne peut pas paginer
1098
+    if ($b === '') {
1099
+        $msg = [
1100
+            'zbug_champ_hors_boucle',
1101
+            ['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION']
1102
+        ];
1103
+        erreur_squelette($msg, $p);
1104
+
1105
+        return $p;
1106
+    }
1107
+
1108
+    // s'il n'y a pas de mode_partie, c'est qu'on se trouve
1109
+    // dans un boucle recursive ou qu'on a oublie le critere {pagination}
1110
+    if (!$p->boucles[$b]->mode_partie) {
1111
+        if (!$p->boucles[$b]->table_optionnelle) {
1112
+            $msg = [
1113
+                'zbug_pagination_sans_critere',
1114
+                ['champ' => '#PAGINATION']
1115
+            ];
1116
+            erreur_squelette($msg, $p);
1117
+        }
1118
+
1119
+        return $p;
1120
+    }
1121
+
1122
+    // a priori true
1123
+    // si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1124
+    // si true, les arguments simples (sans truc=chose) vont degager
1125
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1126
+    if (is_countable($_contexte) ? count($_contexte) : 0) {
1127
+        $key = key($_contexte);
1128
+        if (is_numeric($key)) {
1129
+            array_shift($_contexte);
1130
+            $__modele = interprete_argument_balise(1, $p);
1131
+        }
1132
+    }
1133
+
1134
+    if (is_countable($_contexte) ? count($_contexte) : 0) {
1135
+        $code_contexte = implode(',', $_contexte);
1136
+    } else {
1137
+        $code_contexte = '';
1138
+    }
1139
+
1140
+    $connect = $p->boucles[$b]->sql_serveur;
1141
+    $pas = $p->boucles[$b]->total_parties;
1142
+    $f_pagination = chercher_filtre('pagination');
1143
+    $type = $p->boucles[$b]->modificateur['debut_nom'];
1144
+    $modif = ($type[0] !== "'") ? "'debut'.$type"
1145
+        : ("'debut" . substr($type, 1));
1146
+
1147
+    $p->code = sprintf(
1148
+        CODE_PAGINATION,
1149
+        $f_pagination,
1150
+        $b,
1151
+        $type,
1152
+        $modif,
1153
+        $pas,
1154
+        $liste,
1155
+        ((isset($__modele) && $__modele) ? $__modele : "''"),
1156
+        _q($connect),
1157
+        $code_contexte
1158
+    );
1159
+
1160
+    $p->boucles[$b]->numrows = true;
1161
+    $p->interdire_scripts = false;
1162
+
1163
+    return $p;
1164 1164
 }
1165 1165
 
1166 1166
 
@@ -1187,11 +1187,11 @@  discard block
 block discarded – undo
1187 1187
  *     Pile complétée par le code à générer
1188 1188
  **/
1189 1189
 function balise_ANCRE_PAGINATION_dist($p) {
1190
-	if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1191
-		return $f($p, $liste = 'false');
1192
-	} else {
1193
-		return null;
1194
-	} // ou une erreur ?
1190
+    if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1191
+        return $f($p, $liste = 'false');
1192
+    } else {
1193
+        return null;
1194
+    } // ou une erreur ?
1195 1195
 }
1196 1196
 
1197 1197
 
@@ -1212,17 +1212,17 @@  discard block
 block discarded – undo
1212 1212
  *     Pile complétée par le code à générer
1213 1213
  **/
1214 1214
 function balise_GRAND_TOTAL_dist($p) {
1215
-	$b = index_boucle_mere($p);
1216
-	if ($b === '') {
1217
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
1218
-		erreur_squelette($msg, $p);
1219
-	} else {
1220
-		$p->code = "(\$Numrows['$b']['grand_total'] ?? \$Numrows['$b']['total'] ?? 0)";
1221
-		$p->boucles[$b]->numrows = true;
1222
-		$p->interdire_scripts = false;
1223
-	}
1215
+    $b = index_boucle_mere($p);
1216
+    if ($b === '') {
1217
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
1218
+        erreur_squelette($msg, $p);
1219
+    } else {
1220
+        $p->code = "(\$Numrows['$b']['grand_total'] ?? \$Numrows['$b']['total'] ?? 0)";
1221
+        $p->boucles[$b]->numrows = true;
1222
+        $p->interdire_scripts = false;
1223
+    }
1224 1224
 
1225
-	return $p;
1225
+    return $p;
1226 1226
 }
1227 1227
 
1228 1228
 
@@ -1250,10 +1250,10 @@  discard block
 block discarded – undo
1250 1250
  *     Pile complétée par le code à générer
1251 1251
  **/
1252 1252
 function balise_SELF_dist($p) {
1253
-	$p->code = 'self()';
1254
-	$p->interdire_scripts = false;
1253
+    $p->code = 'self()';
1254
+    $p->interdire_scripts = false;
1255 1255
 
1256
-	return $p;
1256
+    return $p;
1257 1257
 }
1258 1258
 
1259 1259
 
@@ -1280,17 +1280,17 @@  discard block
 block discarded – undo
1280 1280
  *     Pile complétée par le code à générer
1281 1281
  **/
1282 1282
 function balise_CHEMIN_dist($p) {
1283
-	$arg = interprete_argument_balise(1, $p);
1284
-	if (!$arg) {
1285
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']];
1286
-		erreur_squelette($msg, $p);
1287
-	} else {
1288
-		$p->code = 'find_in_path((string)' . $arg . ')';
1289
-	}
1283
+    $arg = interprete_argument_balise(1, $p);
1284
+    if (!$arg) {
1285
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']];
1286
+        erreur_squelette($msg, $p);
1287
+    } else {
1288
+        $p->code = 'find_in_path((string)' . $arg . ')';
1289
+    }
1290 1290
 
1291
-	$p->interdire_scripts = false;
1291
+    $p->interdire_scripts = false;
1292 1292
 
1293
-	return $p;
1293
+    return $p;
1294 1294
 }
1295 1295
 
1296 1296
 /**
@@ -1315,16 +1315,16 @@  discard block
 block discarded – undo
1315 1315
  *     Pile complétée par le code à générer
1316 1316
  **/
1317 1317
 function balise_CHEMIN_IMAGE_dist($p) {
1318
-	$arg = interprete_argument_balise(1, $p);
1319
-	if (!$arg) {
1320
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']];
1321
-		erreur_squelette($msg, $p);
1322
-	} else {
1323
-		$p->code = 'chemin_image((string)' . $arg . ')';
1324
-	}
1318
+    $arg = interprete_argument_balise(1, $p);
1319
+    if (!$arg) {
1320
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']];
1321
+        erreur_squelette($msg, $p);
1322
+    } else {
1323
+        $p->code = 'chemin_image((string)' . $arg . ')';
1324
+    }
1325 1325
 
1326
-	$p->interdire_scripts = false;
1327
-	return $p;
1326
+    $p->interdire_scripts = false;
1327
+    return $p;
1328 1328
 }
1329 1329
 
1330 1330
 
@@ -1362,36 +1362,36 @@  discard block
 block discarded – undo
1362 1362
  **/
1363 1363
 function balise_ENV_dist($p, $src = null) {
1364 1364
 
1365
-	// cle du tableau desiree
1366
-	$_nom = interprete_argument_balise(1, $p);
1367
-	// valeur par defaut
1368
-	$_sinon = interprete_argument_balise(2, $p);
1365
+    // cle du tableau desiree
1366
+    $_nom = interprete_argument_balise(1, $p);
1367
+    // valeur par defaut
1368
+    $_sinon = interprete_argument_balise(2, $p);
1369 1369
 
1370
-	// $src est un tableau de donnees sources eventuellement transmis
1371
-	// en absence, on utilise l'environnement du squelette $Pile[0]
1370
+    // $src est un tableau de donnees sources eventuellement transmis
1371
+    // en absence, on utilise l'environnement du squelette $Pile[0]
1372 1372
 
1373
-	if (!$_nom) {
1374
-		// cas de #ENV sans argument : on retourne le serialize() du tableau
1375
-		// une belle fonction [(#ENV|affiche_env)] serait pratique
1376
-		if ($src) {
1377
-			$p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1378
-		} else {
1379
-			$p->code = 'serialize($Pile[0]??[])';
1380
-		}
1381
-	} else {
1382
-		if (!$src) {
1383
-			$src = '$Pile[0]??[]';
1384
-		}
1385
-		if ($_sinon) {
1386
-			$p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1387
-		} else {
1388
-			$p->code = "table_valeur($src, (string)$_nom, null)";
1389
-		}
1390
-	}
1373
+    if (!$_nom) {
1374
+        // cas de #ENV sans argument : on retourne le serialize() du tableau
1375
+        // une belle fonction [(#ENV|affiche_env)] serait pratique
1376
+        if ($src) {
1377
+            $p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1378
+        } else {
1379
+            $p->code = 'serialize($Pile[0]??[])';
1380
+        }
1381
+    } else {
1382
+        if (!$src) {
1383
+            $src = '$Pile[0]??[]';
1384
+        }
1385
+        if ($_sinon) {
1386
+            $p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1387
+        } else {
1388
+            $p->code = "table_valeur($src, (string)$_nom, null)";
1389
+        }
1390
+    }
1391 1391
 
1392
-	#$p->interdire_scripts = true;
1392
+    #$p->interdire_scripts = true;
1393 1393
 
1394
-	return $p;
1394
+    return $p;
1395 1395
 }
1396 1396
 
1397 1397
 /**
@@ -1421,16 +1421,16 @@  discard block
 block discarded – undo
1421 1421
  *     Pile completée du code PHP d'exécution de la balise
1422 1422
  */
1423 1423
 function balise_CONFIG_dist($p) {
1424
-	if (!$arg = interprete_argument_balise(1, $p)) {
1425
-		$arg = "''";
1426
-	}
1427
-	$_sinon = interprete_argument_balise(2, $p);
1428
-	$_unserialize = sinon(interprete_argument_balise(3, $p), 'false');
1424
+    if (!$arg = interprete_argument_balise(1, $p)) {
1425
+        $arg = "''";
1426
+    }
1427
+    $_sinon = interprete_argument_balise(2, $p);
1428
+    $_unserialize = sinon(interprete_argument_balise(3, $p), 'false');
1429 1429
 
1430
-	$p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1431
-		($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1430
+    $p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1431
+        ($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1432 1432
 
1433
-	return $p;
1433
+    return $p;
1434 1434
 }
1435 1435
 
1436 1436
 
@@ -1453,10 +1453,10 @@  discard block
 block discarded – undo
1453 1453
  *     Pile completée du code PHP d'exécution de la balise
1454 1454
  */
1455 1455
 function balise_CONNECT_dist($p) {
1456
-	$p->code = '($connect ? $connect : NULL)';
1457
-	$p->interdire_scripts = false;
1456
+    $p->code = '($connect ? $connect : NULL)';
1457
+    $p->interdire_scripts = false;
1458 1458
 
1459
-	return $p;
1459
+    return $p;
1460 1460
 }
1461 1461
 
1462 1462
 
@@ -1484,15 +1484,15 @@  discard block
 block discarded – undo
1484 1484
  *     Pile completée du code PHP d'exécution de la balise
1485 1485
  **/
1486 1486
 function balise_SESSION_dist($p) {
1487
-	$p->descr['session'] = true;
1487
+    $p->descr['session'] = true;
1488 1488
 
1489
-	$f = function_exists('balise_ENV')
1490
-		? 'balise_ENV'
1491
-		: 'balise_ENV_dist';
1489
+    $f = function_exists('balise_ENV')
1490
+        ? 'balise_ENV'
1491
+        : 'balise_ENV_dist';
1492 1492
 
1493
-	$p = $f($p, '$GLOBALS["visiteur_session"]??[]');
1493
+    $p = $f($p, '$GLOBALS["visiteur_session"]??[]');
1494 1494
 
1495
-	return $p;
1495
+    return $p;
1496 1496
 }
1497 1497
 
1498 1498
 
@@ -1515,18 +1515,18 @@  discard block
 block discarded – undo
1515 1515
  *     Pile completée du code PHP d'exécution de la balise
1516 1516
  **/
1517 1517
 function balise_SESSION_SET_dist($p) {
1518
-	$_nom = interprete_argument_balise(1, $p);
1519
-	$_val = interprete_argument_balise(2, $p);
1520
-	if (!$_nom || !$_val) {
1521
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']];
1522
-		erreur_squelette($err_b_s_a, $p);
1523
-	} else {
1524
-		$p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1525
-	}
1518
+    $_nom = interprete_argument_balise(1, $p);
1519
+    $_val = interprete_argument_balise(2, $p);
1520
+    if (!$_nom || !$_val) {
1521
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']];
1522
+        erreur_squelette($err_b_s_a, $p);
1523
+    } else {
1524
+        $p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1525
+    }
1526 1526
 
1527
-	$p->interdire_scripts = false;
1527
+    $p->interdire_scripts = false;
1528 1528
 
1529
-	return $p;
1529
+    return $p;
1530 1530
 }
1531 1531
 
1532 1532
 
@@ -1557,30 +1557,30 @@  discard block
 block discarded – undo
1557 1557
  *     Pile completée du code PHP d'exécution de la balise
1558 1558
  **/
1559 1559
 function balise_EVAL_dist($p) {
1560
-	$php = interprete_argument_balise(1, $p);
1561
-	if ($php) {
1562
-		# optimisation sur les #EVAL{une expression sans #BALISE}
1563
-		# attention au commentaire "// x signes" qui precede
1564
-		if (
1565
-			preg_match(
1566
-				",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1567
-				$php,
1568
-				$r
1569
-			)
1570
-		) {
1571
-			$p->code = /* $r[1]. */
1572
-				'(' . $r[2] . ')';
1573
-		} else {
1574
-			$p->code = "eval('return '.$php.';')";
1575
-		}
1576
-	} else {
1577
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']];
1578
-		erreur_squelette($msg, $p);
1579
-	}
1580
-
1581
-	#$p->interdire_scripts = true;
1582
-
1583
-	return $p;
1560
+    $php = interprete_argument_balise(1, $p);
1561
+    if ($php) {
1562
+        # optimisation sur les #EVAL{une expression sans #BALISE}
1563
+        # attention au commentaire "// x signes" qui precede
1564
+        if (
1565
+            preg_match(
1566
+                ",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1567
+                $php,
1568
+                $r
1569
+            )
1570
+        ) {
1571
+            $p->code = /* $r[1]. */
1572
+                '(' . $r[2] . ')';
1573
+        } else {
1574
+            $p->code = "eval('return '.$php.';')";
1575
+        }
1576
+    } else {
1577
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']];
1578
+        erreur_squelette($msg, $p);
1579
+    }
1580
+
1581
+    #$p->interdire_scripts = true;
1582
+
1583
+    return $p;
1584 1584
 }
1585 1585
 
1586 1586
 
@@ -1610,19 +1610,19 @@  discard block
 block discarded – undo
1610 1610
  **/
1611 1611
 function balise_CHAMP_SQL_dist($p) {
1612 1612
 
1613
-	if (
1614
-		$p->param
1615
-		&& isset($p->param[0][1][0])
1616
-		&& ($champ = ($p->param[0][1][0]->texte))
1617
-	) {
1618
-		$p->code = champ_sql($champ, $p);
1619
-	} else {
1620
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']];
1621
-		erreur_squelette($err_b_s_a, $p);
1622
-	}
1613
+    if (
1614
+        $p->param
1615
+        && isset($p->param[0][1][0])
1616
+        && ($champ = ($p->param[0][1][0]->texte))
1617
+    ) {
1618
+        $p->code = champ_sql($champ, $p);
1619
+    } else {
1620
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']];
1621
+        erreur_squelette($err_b_s_a, $p);
1622
+    }
1623 1623
 
1624
-	#$p->interdire_scripts = true;
1625
-	return $p;
1624
+    #$p->interdire_scripts = true;
1625
+    return $p;
1626 1626
 }
1627 1627
 
1628 1628
 /**
@@ -1648,13 +1648,13 @@  discard block
 block discarded – undo
1648 1648
  *     Pile complétée par le code à générer
1649 1649
  **/
1650 1650
 function balise_VAL_dist($p) {
1651
-	$p->code = interprete_argument_balise(1, $p) ?? '';
1652
-	if (!strlen($p->code)) {
1653
-		$p->code = "''";
1654
-	}
1655
-	$p->interdire_scripts = false;
1651
+    $p->code = interprete_argument_balise(1, $p) ?? '';
1652
+    if (!strlen($p->code)) {
1653
+        $p->code = "''";
1654
+    }
1655
+    $p->interdire_scripts = false;
1656 1656
 
1657
-	return $p;
1657
+    return $p;
1658 1658
 }
1659 1659
 
1660 1660
 /**
@@ -1683,10 +1683,10 @@  discard block
 block discarded – undo
1683 1683
  *     Pile complétée par le code à générer
1684 1684
  **/
1685 1685
 function balise_REM_dist($p) {
1686
-	$p->code = "''";
1687
-	$p->interdire_scripts = false;
1686
+    $p->code = "''";
1687
+    $p->interdire_scripts = false;
1688 1688
 
1689
-	return $p;
1689
+    return $p;
1690 1690
 }
1691 1691
 
1692 1692
 /**
@@ -1696,10 +1696,10 @@  discard block
 block discarded – undo
1696 1696
  * @return mixed
1697 1697
  */
1698 1698
 function balise_NULL_dist($p) {
1699
-	$p->code = 'null';
1700
-	$p->interdire_scripts = false;
1699
+    $p->code = 'null';
1700
+    $p->interdire_scripts = false;
1701 1701
 
1702
-	return $p;
1702
+    return $p;
1703 1703
 }
1704 1704
 
1705 1705
 
@@ -1723,18 +1723,18 @@  discard block
 block discarded – undo
1723 1723
  **/
1724 1724
 function balise_HTTP_HEADER_dist($p) {
1725 1725
 
1726
-	$header = interprete_argument_balise(1, $p);
1727
-	if (!$header) {
1728
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']];
1729
-		erreur_squelette($err_b_s_a, $p);
1730
-	} else {
1731
-		$p->code = "'<'.'?php header(' . _q("
1732
-			. $header
1733
-			. ") . '); ?'.'>'";
1734
-	}
1735
-	$p->interdire_scripts = false;
1726
+    $header = interprete_argument_balise(1, $p);
1727
+    if (!$header) {
1728
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']];
1729
+        erreur_squelette($err_b_s_a, $p);
1730
+    } else {
1731
+        $p->code = "'<'.'?php header(' . _q("
1732
+            . $header
1733
+            . ") . '); ?'.'>'";
1734
+    }
1735
+    $p->interdire_scripts = false;
1736 1736
 
1737
-	return $p;
1737
+    return $p;
1738 1738
 }
1739 1739
 
1740 1740
 
@@ -1759,22 +1759,22 @@  discard block
 block discarded – undo
1759 1759
  *     Pile complétée par le code à générer
1760 1760
  **/
1761 1761
 function balise_FILTRE_dist($p) {
1762
-	if ($p->param) {
1763
-		$args = [];
1764
-		foreach ($p->param as $i => $ignore) {
1765
-			$args[] = interprete_argument_balise($i + 1, $p);
1766
-		}
1767
-		$p->code = "'<' . '"
1768
-			. '?php header("X-Spip-Filtre: \'.'
1769
-			. join('.\'|\'.', $args)
1770
-			. " . '\"); ?'.'>'";
1762
+    if ($p->param) {
1763
+        $args = [];
1764
+        foreach ($p->param as $i => $ignore) {
1765
+            $args[] = interprete_argument_balise($i + 1, $p);
1766
+        }
1767
+        $p->code = "'<' . '"
1768
+            . '?php header("X-Spip-Filtre: \'.'
1769
+            . join('.\'|\'.', $args)
1770
+            . " . '\"); ?'.'>'";
1771 1771
 
1772
-		$p->interdire_scripts = false;
1772
+        $p->interdire_scripts = false;
1773 1773
 
1774
-		return $p;
1775
-	}
1774
+        return $p;
1775
+    }
1776 1776
 
1777
-	return null;
1777
+    return null;
1778 1778
 }
1779 1779
 
1780 1780
 
@@ -1810,55 +1810,55 @@  discard block
 block discarded – undo
1810 1810
  **/
1811 1811
 function balise_CACHE_dist($p) {
1812 1812
 
1813
-	if ($p->param) {
1814
-		$duree = valeur_numerique($p->param[0][1][0]->texte);
1815
-
1816
-		// noter la duree du cache dans un entete proprietaire
1817
-
1818
-		$code = "'<'.'" . '?php header("X-Spip-Cache: '
1819
-			. $duree
1820
-			. '"); ?' . "'.'>'";
1821
-
1822
-		// Remplir le header Cache-Control
1823
-		// cas #CACHE{0}
1824
-		if ($duree == 0) {
1825
-			$code .= ".'<'.'"
1826
-				. '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1827
-				. "'.'><'.'"
1828
-				. '?php header("Pragma: no-cache"); ?'
1829
-				. "'.'>'";
1830
-		}
1831
-
1832
-		// recuperer les parametres suivants
1833
-		$i = 1;
1834
-		while (isset($p->param[0][++$i])) {
1835
-			$pa = ($p->param[0][$i][0]->texte);
1836
-
1837
-			if (
1838
-				$pa == 'cache-client'
1839
-				&& $duree > 0
1840
-			) {
1841
-				$code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1842
-					. $duree
1843
-					. '"); ?' . "'.'>'";
1844
-				// il semble logique, si on cache-client, de ne pas invalider
1845
-				$pa = 'statique';
1846
-			}
1847
-
1848
-			if (
1849
-				$pa == 'statique'
1850
-				&& $duree > 0
1851
-			) {
1852
-				$code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1853
-			}
1854
-		}
1855
-	} else {
1856
-		$code = "''";
1857
-	}
1858
-	$p->code = $code;
1859
-	$p->interdire_scripts = false;
1860
-
1861
-	return $p;
1813
+    if ($p->param) {
1814
+        $duree = valeur_numerique($p->param[0][1][0]->texte);
1815
+
1816
+        // noter la duree du cache dans un entete proprietaire
1817
+
1818
+        $code = "'<'.'" . '?php header("X-Spip-Cache: '
1819
+            . $duree
1820
+            . '"); ?' . "'.'>'";
1821
+
1822
+        // Remplir le header Cache-Control
1823
+        // cas #CACHE{0}
1824
+        if ($duree == 0) {
1825
+            $code .= ".'<'.'"
1826
+                . '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1827
+                . "'.'><'.'"
1828
+                . '?php header("Pragma: no-cache"); ?'
1829
+                . "'.'>'";
1830
+        }
1831
+
1832
+        // recuperer les parametres suivants
1833
+        $i = 1;
1834
+        while (isset($p->param[0][++$i])) {
1835
+            $pa = ($p->param[0][$i][0]->texte);
1836
+
1837
+            if (
1838
+                $pa == 'cache-client'
1839
+                && $duree > 0
1840
+            ) {
1841
+                $code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1842
+                    . $duree
1843
+                    . '"); ?' . "'.'>'";
1844
+                // il semble logique, si on cache-client, de ne pas invalider
1845
+                $pa = 'statique';
1846
+            }
1847
+
1848
+            if (
1849
+                $pa == 'statique'
1850
+                && $duree > 0
1851
+            ) {
1852
+                $code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1853
+            }
1854
+        }
1855
+    } else {
1856
+        $code = "''";
1857
+    }
1858
+    $p->code = $code;
1859
+    $p->interdire_scripts = false;
1860
+
1861
+    return $p;
1862 1862
 }
1863 1863
 
1864 1864
 
@@ -1890,13 +1890,13 @@  discard block
 block discarded – undo
1890 1890
  *     Pile complétée par le code à générer
1891 1891
  */
1892 1892
 function balise_INSERT_HEAD_dist($p) {
1893
-	$p->code = "'<'.'"
1894
-		. '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1895
-		. "'.'>'";
1896
-	$p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1897
-	$p->interdire_scripts = false;
1893
+    $p->code = "'<'.'"
1894
+        . '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1895
+        . "'.'>'";
1896
+    $p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1897
+    $p->interdire_scripts = false;
1898 1898
 
1899
-	return $p;
1899
+    return $p;
1900 1900
 }
1901 1901
 
1902 1902
 /**
@@ -1914,10 +1914,10 @@  discard block
 block discarded – undo
1914 1914
  *     Pile complétée par le code à générer
1915 1915
  */
1916 1916
 function balise_INSERT_HEAD_CSS_dist($p) {
1917
-	$p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1918
-	$p->interdire_scripts = false;
1917
+    $p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1918
+    $p->interdire_scripts = false;
1919 1919
 
1920
-	return $p;
1920
+    return $p;
1921 1921
 }
1922 1922
 
1923 1923
 /**
@@ -1932,11 +1932,11 @@  discard block
 block discarded – undo
1932 1932
  *     Pile complétée par le code à générer
1933 1933
  **/
1934 1934
 function balise_INCLUDE_dist($p) {
1935
-	if (function_exists('balise_INCLURE')) {
1936
-		return balise_INCLURE($p);
1937
-	} else {
1938
-		return balise_INCLURE_dist($p);
1939
-	}
1935
+    if (function_exists('balise_INCLURE')) {
1936
+        return balise_INCLURE($p);
1937
+    } else {
1938
+        return balise_INCLURE_dist($p);
1939
+    }
1940 1940
 }
1941 1941
 
1942 1942
 /**
@@ -1970,66 +1970,66 @@  discard block
 block discarded – undo
1970 1970
  *     Pile complétée par le code à générer
1971 1971
  **/
1972 1972
 function balise_INCLURE_dist($p) {
1973
-	$id_boucle = $p->id_boucle;
1974
-	// la lang n'est pas passe de facon automatique par argumenter
1975
-	// mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1976
-	// en option
1977
-
1978
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1979
-
1980
-	// erreur de syntaxe = fond absent
1981
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1982
-	if (!$_contexte) {
1983
-		$_contexte = [];
1984
-	}
1985
-
1986
-	if (isset($_contexte['fond'])) {
1987
-		$f = $_contexte['fond'];
1988
-		// toujours vrai :
1989
-		if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1990
-			$f = $r[1];
1991
-			unset($_contexte['fond']);
1992
-		} else {
1993
-			spip_logger()->info('compilation de #INCLURE a revoir');
1994
-		}
1995
-
1996
-		// #INCLURE{doublons}
1997
-		if (isset($_contexte['doublons'])) {
1998
-			$_contexte['doublons'] = "'doublons' => \$doublons";
1999
-		}
2000
-
2001
-		// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
2002
-		$flag_env = false;
2003
-		if (isset($_contexte['env']) || isset($_contexte['self'])) {
2004
-			$flag_env = true;
2005
-			unset($_contexte['env']);
2006
-		}
2007
-
2008
-		$_options = [];
2009
-		if (isset($_contexte['ajax'])) {
2010
-			$_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2011
-			unset($_contexte['ajax']);
2012
-		}
2013
-		if ($p->etoile) {
2014
-			$_options[] = "'etoile'=>true";
2015
-		}
2016
-		$_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')';
2017
-
2018
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2019
-		if ($flag_env) {
2020
-			$_l = "array_merge(\$Pile[0],$_l)";
2021
-		}
2022
-
2023
-		$p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect') ?? ''");
2024
-	} elseif (!isset($_contexte[1])) {
2025
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']];
2026
-		erreur_squelette($msg, $p);
2027
-	} else {
2028
-		$p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2029
-	}
2030
-
2031
-	$p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2032
-	return $p;
1973
+    $id_boucle = $p->id_boucle;
1974
+    // la lang n'est pas passe de facon automatique par argumenter
1975
+    // mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1976
+    // en option
1977
+
1978
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1979
+
1980
+    // erreur de syntaxe = fond absent
1981
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1982
+    if (!$_contexte) {
1983
+        $_contexte = [];
1984
+    }
1985
+
1986
+    if (isset($_contexte['fond'])) {
1987
+        $f = $_contexte['fond'];
1988
+        // toujours vrai :
1989
+        if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1990
+            $f = $r[1];
1991
+            unset($_contexte['fond']);
1992
+        } else {
1993
+            spip_logger()->info('compilation de #INCLURE a revoir');
1994
+        }
1995
+
1996
+        // #INCLURE{doublons}
1997
+        if (isset($_contexte['doublons'])) {
1998
+            $_contexte['doublons'] = "'doublons' => \$doublons";
1999
+        }
2000
+
2001
+        // Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
2002
+        $flag_env = false;
2003
+        if (isset($_contexte['env']) || isset($_contexte['self'])) {
2004
+            $flag_env = true;
2005
+            unset($_contexte['env']);
2006
+        }
2007
+
2008
+        $_options = [];
2009
+        if (isset($_contexte['ajax'])) {
2010
+            $_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2011
+            unset($_contexte['ajax']);
2012
+        }
2013
+        if ($p->etoile) {
2014
+            $_options[] = "'etoile'=>true";
2015
+        }
2016
+        $_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')';
2017
+
2018
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2019
+        if ($flag_env) {
2020
+            $_l = "array_merge(\$Pile[0],$_l)";
2021
+        }
2022
+
2023
+        $p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect') ?? ''");
2024
+    } elseif (!isset($_contexte[1])) {
2025
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']];
2026
+        erreur_squelette($msg, $p);
2027
+    } else {
2028
+        $p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2029
+    }
2030
+
2031
+    $p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2032
+    return $p;
2033 2033
 }
2034 2034
 
2035 2035
 
@@ -2057,69 +2057,69 @@  discard block
 block discarded – undo
2057 2057
  **/
2058 2058
 function balise_MODELE_dist($p) {
2059 2059
 
2060
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2061
-
2062
-	// erreur de syntaxe = fond absent
2063
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2064
-	if (!$_contexte) {
2065
-		$_contexte = [];
2066
-	}
2067
-
2068
-	if (!isset($_contexte[1])) {
2069
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']];
2070
-		erreur_squelette($msg, $p);
2071
-	} else {
2072
-		$nom = $_contexte[1];
2073
-		unset($_contexte[1]);
2074
-
2075
-		if (preg_match("/^\s*'[^']*'/s", $nom)) {
2076
-			$nom = "'modeles/" . substr($nom, 1);
2077
-		} else {
2078
-			$nom = "'modeles/' . $nom";
2079
-		}
2080
-
2081
-		$flag_env = false;
2082
-		if (isset($_contexte['env'])) {
2083
-			$flag_env = true;
2084
-			unset($_contexte['env']);
2085
-		}
2086
-
2087
-		// Incoherence dans la syntaxe du contexte. A revoir.
2088
-		// Reserver la cle primaire de la boucle courante si elle existe
2089
-		if (isset($p->boucles[$p->id_boucle]->primary)) {
2090
-			$primary = $p->boucles[$p->id_boucle]->primary;
2091
-			if (!strpos($primary, ',')) {
2092
-				$id = champ_sql($primary, $p);
2093
-				$_contexte[] = "'$primary'=>" . $id;
2094
-				$_contexte[] = "'id'=>" . $id;
2095
-			}
2096
-		}
2097
-		$_contexte[] = "'recurs'=>(++\$recurs)";
2098
-		$connect = '';
2099
-		if (isset($p->boucles[$p->id_boucle])) {
2100
-			$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2101
-		}
2102
-
2103
-		$_options = memoriser_contexte_compil($p);
2104
-		$_options = "'compil'=>array($_options), 'trim'=>true";
2105
-		if (isset($_contexte['ajax'])) {
2106
-			$_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2107
-			unset($_contexte['ajax']);
2108
-		}
2109
-
2110
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2111
-		if ($flag_env) {
2112
-			$_l = "array_merge(\$Pile[0],$_l)";
2113
-		}
2114
-
2115
-		$page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2116
-
2117
-		$p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2118
-
2119
-		$p->interdire_scripts = false; // securite assuree par le squelette
2120
-	}
2121
-
2122
-	return $p;
2060
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2061
+
2062
+    // erreur de syntaxe = fond absent
2063
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2064
+    if (!$_contexte) {
2065
+        $_contexte = [];
2066
+    }
2067
+
2068
+    if (!isset($_contexte[1])) {
2069
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']];
2070
+        erreur_squelette($msg, $p);
2071
+    } else {
2072
+        $nom = $_contexte[1];
2073
+        unset($_contexte[1]);
2074
+
2075
+        if (preg_match("/^\s*'[^']*'/s", $nom)) {
2076
+            $nom = "'modeles/" . substr($nom, 1);
2077
+        } else {
2078
+            $nom = "'modeles/' . $nom";
2079
+        }
2080
+
2081
+        $flag_env = false;
2082
+        if (isset($_contexte['env'])) {
2083
+            $flag_env = true;
2084
+            unset($_contexte['env']);
2085
+        }
2086
+
2087
+        // Incoherence dans la syntaxe du contexte. A revoir.
2088
+        // Reserver la cle primaire de la boucle courante si elle existe
2089
+        if (isset($p->boucles[$p->id_boucle]->primary)) {
2090
+            $primary = $p->boucles[$p->id_boucle]->primary;
2091
+            if (!strpos($primary, ',')) {
2092
+                $id = champ_sql($primary, $p);
2093
+                $_contexte[] = "'$primary'=>" . $id;
2094
+                $_contexte[] = "'id'=>" . $id;
2095
+            }
2096
+        }
2097
+        $_contexte[] = "'recurs'=>(++\$recurs)";
2098
+        $connect = '';
2099
+        if (isset($p->boucles[$p->id_boucle])) {
2100
+            $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2101
+        }
2102
+
2103
+        $_options = memoriser_contexte_compil($p);
2104
+        $_options = "'compil'=>array($_options), 'trim'=>true";
2105
+        if (isset($_contexte['ajax'])) {
2106
+            $_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2107
+            unset($_contexte['ajax']);
2108
+        }
2109
+
2110
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2111
+        if ($flag_env) {
2112
+            $_l = "array_merge(\$Pile[0],$_l)";
2113
+        }
2114
+
2115
+        $page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2116
+
2117
+        $p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2118
+
2119
+        $p->interdire_scripts = false; // securite assuree par le squelette
2120
+    }
2121
+
2122
+    return $p;
2123 2123
 }
2124 2124
 
2125 2125
 
@@ -2143,21 +2143,21 @@  discard block
 block discarded – undo
2143 2143
  *     Pile complétée par le code à générer
2144 2144
  **/
2145 2145
 function balise_SET_dist($p) {
2146
-	$_nom = interprete_argument_balise(1, $p);
2147
-	$_val = interprete_argument_balise(2, $p);
2146
+    $_nom = interprete_argument_balise(1, $p);
2147
+    $_val = interprete_argument_balise(2, $p);
2148 2148
 
2149
-	if (!$_nom || !$_val) {
2150
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']];
2151
-		erreur_squelette($err_b_s_a, $p);
2152
-	}
2153
-	// affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2154
-	// cf https://bugs.php.net/bug.php?id=65845
2155
-	else {
2156
-		$p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2157
-	}
2149
+    if (!$_nom || !$_val) {
2150
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']];
2151
+        erreur_squelette($err_b_s_a, $p);
2152
+    }
2153
+    // affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2154
+    // cf https://bugs.php.net/bug.php?id=65845
2155
+    else {
2156
+        $p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2157
+    }
2158 2158
 
2159
-	$p->interdire_scripts = false; // la balise ne renvoie rien
2160
-	return $p;
2159
+    $p->interdire_scripts = false; // la balise ne renvoie rien
2160
+    return $p;
2161 2161
 }
2162 2162
 
2163 2163
 
@@ -2187,12 +2187,12 @@  discard block
 block discarded – undo
2187 2187
  *     Pile complétée par le code à générer
2188 2188
  **/
2189 2189
 function balise_GET_dist($p) {
2190
-	$p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2191
-	if (function_exists('balise_ENV')) {
2192
-		return balise_ENV($p, '$Pile["vars"]??[]');
2193
-	} else {
2194
-		return balise_ENV_dist($p, '$Pile["vars"]??[]');
2195
-	}
2190
+    $p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2191
+    if (function_exists('balise_ENV')) {
2192
+        return balise_ENV($p, '$Pile["vars"]??[]');
2193
+    } else {
2194
+        return balise_ENV_dist($p, '$Pile["vars"]??[]');
2195
+    }
2196 2196
 }
2197 2197
 
2198 2198
 
@@ -2215,22 +2215,22 @@  discard block
 block discarded – undo
2215 2215
  *     Pile complétée par le code à générer
2216 2216
  **/
2217 2217
 function balise_DOUBLONS_dist($p) {
2218
-	if ($type = interprete_argument_balise(1, $p)) {
2219
-		if ($famille = interprete_argument_balise(2, $p)) {
2220
-			$type .= '.' . $famille;
2221
-		}
2222
-		$p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2223
-		if (!$p->etoile) {
2224
-			$p->code = 'array_filter(array_map("intval",explode(",",'
2225
-				. $p->code . ')))';
2226
-		}
2227
-	} else {
2228
-		$p->code = '$doublons';
2229
-	}
2218
+    if ($type = interprete_argument_balise(1, $p)) {
2219
+        if ($famille = interprete_argument_balise(2, $p)) {
2220
+            $type .= '.' . $famille;
2221
+        }
2222
+        $p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2223
+        if (!$p->etoile) {
2224
+            $p->code = 'array_filter(array_map("intval",explode(",",'
2225
+                . $p->code . ')))';
2226
+        }
2227
+    } else {
2228
+        $p->code = '$doublons';
2229
+    }
2230 2230
 
2231
-	$p->interdire_scripts = false;
2231
+    $p->interdire_scripts = false;
2232 2232
 
2233
-	return $p;
2233
+    return $p;
2234 2234
 }
2235 2235
 
2236 2236
 
@@ -2253,18 +2253,18 @@  discard block
 block discarded – undo
2253 2253
  *     Pile complétée par le code à générer
2254 2254
  **/
2255 2255
 function balise_PIPELINE_dist($p) {
2256
-	$_pipe = interprete_argument_balise(1, $p);
2257
-	if (!$_pipe) {
2258
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']];
2259
-		erreur_squelette($err_b_s_a, $p);
2260
-	} else {
2261
-		$_flux = interprete_argument_balise(2, $p);
2262
-		$_flux = $_flux ?: "''";
2263
-		$p->code = "pipeline( $_pipe , $_flux )";
2264
-		$p->interdire_scripts = false;
2265
-	}
2256
+    $_pipe = interprete_argument_balise(1, $p);
2257
+    if (!$_pipe) {
2258
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']];
2259
+        erreur_squelette($err_b_s_a, $p);
2260
+    } else {
2261
+        $_flux = interprete_argument_balise(2, $p);
2262
+        $_flux = $_flux ?: "''";
2263
+        $p->code = "pipeline( $_pipe , $_flux )";
2264
+        $p->interdire_scripts = false;
2265
+    }
2266 2266
 
2267
-	return $p;
2267
+    return $p;
2268 2268
 }
2269 2269
 
2270 2270
 
@@ -2289,10 +2289,10 @@  discard block
 block discarded – undo
2289 2289
  *     Pile complétée par le code à générer
2290 2290
  **/
2291 2291
 function balise_EDIT_dist($p) {
2292
-	$p->code = "''";
2293
-	$p->interdire_scripts = false;
2292
+    $p->code = "''";
2293
+    $p->interdire_scripts = false;
2294 2294
 
2295
-	return $p;
2295
+    return $p;
2296 2296
 }
2297 2297
 
2298 2298
 
@@ -2315,11 +2315,11 @@  discard block
 block discarded – undo
2315 2315
  *     Pile complétée par le code à générer
2316 2316
  **/
2317 2317
 function balise_TOTAL_UNIQUE_dist($p) {
2318
-	$_famille = interprete_argument_balise(1, $p);
2319
-	$_famille = $_famille ?: "''";
2320
-	$p->code = "unique('', $_famille, true)";
2318
+    $_famille = interprete_argument_balise(1, $p);
2319
+    $_famille = $_famille ?: "''";
2320
+    $p->code = "unique('', $_famille, true)";
2321 2321
 
2322
-	return $p;
2322
+    return $p;
2323 2323
 }
2324 2324
 
2325 2325
 /**
@@ -2342,19 +2342,19 @@  discard block
 block discarded – undo
2342 2342
  *     Pile complétée par le code à générer
2343 2343
  **/
2344 2344
 function balise_ARRAY_dist($p) {
2345
-	$_code = [];
2346
-	$n = 1;
2347
-	do {
2348
-		$_key = interprete_argument_balise($n++, $p);
2349
-		$_val = interprete_argument_balise($n++, $p);
2350
-		if ($_key && $_val) {
2351
-			$_code[] = "$_key => $_val";
2352
-		}
2353
-	} while ($_key && $_val);
2354
-	$p->code = 'array(' . join(', ', $_code) . ')';
2355
-	$p->interdire_scripts = false;
2345
+    $_code = [];
2346
+    $n = 1;
2347
+    do {
2348
+        $_key = interprete_argument_balise($n++, $p);
2349
+        $_val = interprete_argument_balise($n++, $p);
2350
+        if ($_key && $_val) {
2351
+            $_code[] = "$_key => $_val";
2352
+        }
2353
+    } while ($_key && $_val);
2354
+    $p->code = 'array(' . join(', ', $_code) . ')';
2355
+    $p->interdire_scripts = false;
2356 2356
 
2357
-	return $p;
2357
+    return $p;
2358 2358
 }
2359 2359
 
2360 2360
 /**
@@ -2373,15 +2373,15 @@  discard block
 block discarded – undo
2373 2373
  *     Pile complétée par le code à générer
2374 2374
  */
2375 2375
 function balise_LISTE_dist($p) {
2376
-	$_code = [];
2377
-	$n = 1;
2378
-	while ($_val = interprete_argument_balise($n++, $p)) {
2379
-		$_code[] = $_val;
2380
-	}
2381
-	$p->code = 'array(' . join(', ', $_code) . ')';
2382
-	$p->interdire_scripts = false;
2376
+    $_code = [];
2377
+    $n = 1;
2378
+    while ($_val = interprete_argument_balise($n++, $p)) {
2379
+        $_code[] = $_val;
2380
+    }
2381
+    $p->code = 'array(' . join(', ', $_code) . ')';
2382
+    $p->interdire_scripts = false;
2383 2383
 
2384
-	return $p;
2384
+    return $p;
2385 2385
 }
2386 2386
 
2387 2387
 
@@ -2415,21 +2415,21 @@  discard block
 block discarded – undo
2415 2415
  *     Pile complétée par le code à générer
2416 2416
  **/
2417 2417
 function balise_AUTORISER_dist($p) {
2418
-	$_code = [];
2419
-	$p->descr['session'] = true; // faire un cache par session
2418
+    $_code = [];
2419
+    $p->descr['session'] = true; // faire un cache par session
2420 2420
 
2421
-	$n = 1;
2422
-	while ($_v = interprete_argument_balise($n++, $p)) {
2423
-		$_code[] = $_v;
2424
-	}
2421
+    $n = 1;
2422
+    while ($_v = interprete_argument_balise($n++, $p)) {
2423
+        $_code[] = $_v;
2424
+    }
2425 2425
 
2426
-	$p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(
2427
-		', ',
2428
-		$_code
2429
-	) . ')?" ":"")';
2430
-	$p->interdire_scripts = false;
2426
+    $p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(
2427
+        ', ',
2428
+        $_code
2429
+    ) . ')?" ":"")';
2430
+    $p->interdire_scripts = false;
2431 2431
 
2432
-	return $p;
2432
+    return $p;
2433 2433
 }
2434 2434
 
2435 2435
 
@@ -2453,15 +2453,15 @@  discard block
 block discarded – undo
2453 2453
  *     Pile complétée par le code à générer
2454 2454
  **/
2455 2455
 function balise_PLUGIN_dist($p) {
2456
-	$plugin = interprete_argument_balise(1, $p);
2457
-	$plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2458
-	$type_info = interprete_argument_balise(2, $p);
2459
-	$type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2456
+    $plugin = interprete_argument_balise(1, $p);
2457
+    $plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2458
+    $type_info = interprete_argument_balise(2, $p);
2459
+    $type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2460 2460
 
2461
-	$f = chercher_filtre('info_plugin');
2462
-	$p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2461
+    $f = chercher_filtre('info_plugin');
2462
+    $p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2463 2463
 
2464
-	return $p;
2464
+    return $p;
2465 2465
 }
2466 2466
 
2467 2467
 /**
@@ -2482,9 +2482,9 @@  discard block
 block discarded – undo
2482 2482
  *     Pile complétée par le code à générer
2483 2483
  **/
2484 2484
 function balise_AIDER_dist($p) {
2485
-	$_motif = interprete_argument_balise(1, $p);
2486
-	$p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')";
2487
-	return $p;
2485
+    $_motif = interprete_argument_balise(1, $p);
2486
+    $p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')";
2487
+    return $p;
2488 2488
 }
2489 2489
 
2490 2490
 /**
@@ -2510,16 +2510,16 @@  discard block
 block discarded – undo
2510 2510
  *     Pile complétée par le code à générer
2511 2511
  **/
2512 2512
 function balise_ACTION_FORMULAIRE($p) {
2513
-	if (!$_url = interprete_argument_balise(1, $p)) {
2514
-		$_url = "(\$Pile[0]['action'] ?? '')";
2515
-	}
2516
-	if (!$_form = interprete_argument_balise(2, $p)) {
2517
-		$_form = "(\$Pile[0]['form'] ?? '')";
2518
-	}
2519
-
2520
-	// envoyer le nom du formulaire que l'on traite
2521
-	// transmettre les eventuels args de la balise formulaire
2522
-	$p->code = "	'<span class=\"form-hidden\">' .
2513
+    if (!$_url = interprete_argument_balise(1, $p)) {
2514
+        $_url = "(\$Pile[0]['action'] ?? '')";
2515
+    }
2516
+    if (!$_form = interprete_argument_balise(2, $p)) {
2517
+        $_form = "(\$Pile[0]['form'] ?? '')";
2518
+    }
2519
+
2520
+    // envoyer le nom du formulaire que l'on traite
2521
+    // transmettre les eventuels args de la balise formulaire
2522
+    $p->code = "	'<span class=\"form-hidden\">' .
2523 2523
 	form_hidden($_url) .
2524 2524
 	'<input name=\'formulaire_action\' type=\'hidden\'
2525 2525
 		value=\'' . $_form . '\' />' .
@@ -2530,9 +2530,9 @@  discard block
 block discarded – undo
2530 2530
 	(\$Pile[0]['_hidden'] ?? '') .
2531 2531
 	'</span>'";
2532 2532
 
2533
-	$p->interdire_scripts = false;
2533
+    $p->interdire_scripts = false;
2534 2534
 
2535
-	return $p;
2535
+    return $p;
2536 2536
 }
2537 2537
 
2538 2538
 
@@ -2573,25 +2573,25 @@  discard block
 block discarded – undo
2573 2573
  */
2574 2574
 function balise_BOUTON_ACTION_dist($p) {
2575 2575
 
2576
-	$args = [];
2577
-	for ($k = 1; $k <= 6; $k++) {
2578
-		$_a = interprete_argument_balise($k, $p);
2579
-		if (!$_a) {
2580
-			$_a = "''";
2581
-		}
2582
-		$args[] = $_a;
2583
-	}
2584
-	// supprimer les args vides
2585
-	while (end($args) == "''" && count($args) > 2) {
2586
-		array_pop($args);
2587
-	}
2588
-	$args = implode(',', $args);
2576
+    $args = [];
2577
+    for ($k = 1; $k <= 6; $k++) {
2578
+        $_a = interprete_argument_balise($k, $p);
2579
+        if (!$_a) {
2580
+            $_a = "''";
2581
+        }
2582
+        $args[] = $_a;
2583
+    }
2584
+    // supprimer les args vides
2585
+    while (end($args) == "''" && count($args) > 2) {
2586
+        array_pop($args);
2587
+    }
2588
+    $args = implode(',', $args);
2589 2589
 
2590
-	$bouton_action = chercher_filtre('bouton_action');
2591
-	$p->code = "$bouton_action($args)";
2592
-	$p->interdire_scripts = false;
2590
+    $bouton_action = chercher_filtre('bouton_action');
2591
+    $p->code = "$bouton_action($args)";
2592
+    $p->interdire_scripts = false;
2593 2593
 
2594
-	return $p;
2594
+    return $p;
2595 2595
 }
2596 2596
 
2597 2597
 
@@ -2610,10 +2610,10 @@  discard block
 block discarded – undo
2610 2610
  *     Pile complétée par le code à générer
2611 2611
  */
2612 2612
 function balise_SLOGAN_SITE_SPIP_dist($p) {
2613
-	$p->code = "\$GLOBALS['meta']['slogan_site']";
2613
+    $p->code = "\$GLOBALS['meta']['slogan_site']";
2614 2614
 
2615
-	#$p->interdire_scripts = true;
2616
-	return $p;
2615
+    #$p->interdire_scripts = true;
2616
+    return $p;
2617 2617
 }
2618 2618
 
2619 2619
 
@@ -2637,10 +2637,10 @@  discard block
 block discarded – undo
2637 2637
  *     Pile complétée par le code à générer
2638 2638
  */
2639 2639
 function balise_HTML5_dist($p) {
2640
-	$p->code = html5_permis() ? "' '" : "''";
2641
-	$p->interdire_scripts = false;
2640
+    $p->code = html5_permis() ? "' '" : "''";
2641
+    $p->interdire_scripts = false;
2642 2642
 
2643
-	return $p;
2643
+    return $p;
2644 2644
 }
2645 2645
 
2646 2646
 
@@ -2666,60 +2666,60 @@  discard block
 block discarded – undo
2666 2666
  *     Pile complétée par le code à générer
2667 2667
  */
2668 2668
 function balise_TRI_dist($p, $liste = 'true') {
2669
-	$b = index_boucle_mere($p);
2670
-	// s'il n'y a pas de nom de boucle, on ne peut pas trier
2671
-	if ($b === '') {
2672
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
2673
-		erreur_squelette($msg, $p);
2674
-		$p->code = "''";
2669
+    $b = index_boucle_mere($p);
2670
+    // s'il n'y a pas de nom de boucle, on ne peut pas trier
2671
+    if ($b === '') {
2672
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
2673
+        erreur_squelette($msg, $p);
2674
+        $p->code = "''";
2675 2675
 
2676
-		return $p;
2677
-	}
2678
-	$boucle = $p->boucles[$b];
2676
+        return $p;
2677
+    }
2678
+    $boucle = $p->boucles[$b];
2679 2679
 
2680
-	// s'il n'y a pas de tri_champ, c'est qu'on se trouve
2681
-	// dans un boucle recursive ou qu'on a oublie le critere {tri}
2682
-	if (!isset($boucle->modificateur['tri_champ'])) {
2683
-		$msg = ['zbug_champ_hors_critere', [
2684
-			'champ' => zbug_presenter_champ($p),
2685
-			'critere' => 'tri'
2686
-		]];
2687
-		erreur_squelette($msg, $p);
2688
-		$p->code = "''";
2680
+    // s'il n'y a pas de tri_champ, c'est qu'on se trouve
2681
+    // dans un boucle recursive ou qu'on a oublie le critere {tri}
2682
+    if (!isset($boucle->modificateur['tri_champ'])) {
2683
+        $msg = ['zbug_champ_hors_critere', [
2684
+            'champ' => zbug_presenter_champ($p),
2685
+            'critere' => 'tri'
2686
+        ]];
2687
+        erreur_squelette($msg, $p);
2688
+        $p->code = "''";
2689 2689
 
2690
-		return $p;
2691
-	}
2690
+        return $p;
2691
+    }
2692 2692
 
2693
-	// Différentes infos relatives au tri présentes dans les modificateurs
2694
-	$_tri_nom = $boucle->modificateur['tri_nom'] ; // nom du paramètre définissant le tri
2695
-	$_tri_champ = $boucle->modificateur['tri_champ']; // champ actuel utilisé le tri
2696
-	$_tri_sens = $boucle->modificateur['tri_sens']; // sens de tri actuel
2697
-	$_tri_liste_sens_defaut = $boucle->modificateur['tri_liste_sens_defaut']; // sens par défaut pour chaque champ
2693
+    // Différentes infos relatives au tri présentes dans les modificateurs
2694
+    $_tri_nom = $boucle->modificateur['tri_nom'] ; // nom du paramètre définissant le tri
2695
+    $_tri_champ = $boucle->modificateur['tri_champ']; // champ actuel utilisé le tri
2696
+    $_tri_sens = $boucle->modificateur['tri_sens']; // sens de tri actuel
2697
+    $_tri_liste_sens_defaut = $boucle->modificateur['tri_liste_sens_defaut']; // sens par défaut pour chaque champ
2698 2698
 
2699
-	$_champ_ou_sens = interprete_argument_balise(1, $p);
2700
-	// si pas de champ, renvoyer le critère de tri actuel
2701
-	if (!$_champ_ou_sens) {
2702
-		$p->code = $_tri_champ;
2699
+    $_champ_ou_sens = interprete_argument_balise(1, $p);
2700
+    // si pas de champ, renvoyer le critère de tri actuel
2701
+    if (!$_champ_ou_sens) {
2702
+        $p->code = $_tri_champ;
2703 2703
 
2704
-		return $p;
2705
-	}
2706
-	// forcer la jointure si besoin, et si le champ est statique
2707
-	if (preg_match(",^'([\w.]+)'$,i", $_champ_ou_sens, $m)) {
2708
-		index_pile($b, $m[1], $p->boucles, '', null, true, false);
2709
-	}
2704
+        return $p;
2705
+    }
2706
+    // forcer la jointure si besoin, et si le champ est statique
2707
+    if (preg_match(",^'([\w.]+)'$,i", $_champ_ou_sens, $m)) {
2708
+        index_pile($b, $m[1], $p->boucles, '', null, true, false);
2709
+    }
2710 2710
 
2711
-	$_libelle = interprete_argument_balise(2, $p);
2712
-	$_libelle = $_libelle ?: $_champ_ou_sens;
2711
+    $_libelle = interprete_argument_balise(2, $p);
2712
+    $_libelle = $_libelle ?: $_champ_ou_sens;
2713 2713
 
2714
-	$_class = interprete_argument_balise(3, $p) ?? "''";
2714
+    $_class = interprete_argument_balise(3, $p) ?? "''";
2715 2715
 
2716
-	$nom_pagination = $boucle->modificateur['debut_nom'] ?? '';
2716
+    $nom_pagination = $boucle->modificateur['debut_nom'] ?? '';
2717 2717
 
2718
-	$p->code = "calculer_balise_tri($_champ_ou_sens, $_libelle, $_class, $_tri_nom, $_tri_champ, $_tri_sens, $_tri_liste_sens_defaut, $nom_pagination)";
2718
+    $p->code = "calculer_balise_tri($_champ_ou_sens, $_libelle, $_class, $_tri_nom, $_tri_champ, $_tri_sens, $_tri_liste_sens_defaut, $nom_pagination)";
2719 2719
 
2720
-	$p->interdire_scripts = false;
2720
+    $p->interdire_scripts = false;
2721 2721
 
2722
-	return $p;
2722
+    return $p;
2723 2723
 }
2724 2724
 
2725 2725
 
@@ -2740,21 +2740,21 @@  discard block
 block discarded – undo
2740 2740
  *     Pile complétée par le code à générer
2741 2741
  */
2742 2742
 function balise_SAUTER_dist($p) {
2743
-	$id_boucle = $p->id_boucle;
2743
+    $id_boucle = $p->id_boucle;
2744 2744
 
2745
-	if (empty($p->boucles[$id_boucle])) {
2746
-		$msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']];
2747
-		erreur_squelette($msg, $p);
2748
-	} else {
2749
-		$_saut = interprete_argument_balise(1, $p);
2750
-		$_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2751
-		$_total = "(\$Numrows['$id_boucle']['total'] ?? null)";
2745
+    if (empty($p->boucles[$id_boucle])) {
2746
+        $msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']];
2747
+        erreur_squelette($msg, $p);
2748
+    } else {
2749
+        $_saut = interprete_argument_balise(1, $p);
2750
+        $_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2751
+        $_total = "(\$Numrows['$id_boucle']['total'] ?? null)";
2752 2752
 
2753
-		$p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2754
-	}
2755
-	$p->interdire_scripts = false;
2753
+        $p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2754
+    }
2755
+    $p->interdire_scripts = false;
2756 2756
 
2757
-	return $p;
2757
+    return $p;
2758 2758
 }
2759 2759
 
2760 2760
 
@@ -2776,22 +2776,22 @@  discard block
 block discarded – undo
2776 2776
  *     Pile complétée par le code à générer
2777 2777
  */
2778 2778
 function balise_PUBLIE_dist($p) {
2779
-	if (!$_type = interprete_argument_balise(1, $p)) {
2780
-		$_type = _q($p->type_requete);
2781
-		$_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2782
-	} else {
2783
-		$_id = interprete_argument_balise(2, $p);
2784
-	}
2779
+    if (!$_type = interprete_argument_balise(1, $p)) {
2780
+        $_type = _q($p->type_requete);
2781
+        $_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2782
+    } else {
2783
+        $_id = interprete_argument_balise(2, $p);
2784
+    }
2785 2785
 
2786
-	$connect = '';
2787
-	if (isset($p->boucles[$p->id_boucle])) {
2788
-		$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2789
-	}
2786
+    $connect = '';
2787
+    if (isset($p->boucles[$p->id_boucle])) {
2788
+        $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2789
+    }
2790 2790
 
2791
-	$p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')";
2792
-	$p->interdire_scripts = false;
2791
+    $p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')";
2792
+    $p->interdire_scripts = false;
2793 2793
 
2794
-	return $p;
2794
+    return $p;
2795 2795
 }
2796 2796
 
2797 2797
 /**
@@ -2820,12 +2820,12 @@  discard block
 block discarded – undo
2820 2820
  *     Pile complétée par le code à générer
2821 2821
  */
2822 2822
 function balise_PRODUIRE_dist($p) {
2823
-	$balise_inclure = charger_fonction('INCLURE', 'balise');
2824
-	$p = $balise_inclure($p);
2823
+    $balise_inclure = charger_fonction('INCLURE', 'balise');
2824
+    $p = $balise_inclure($p);
2825 2825
 
2826
-	$p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2826
+    $p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2827 2827
 
2828
-	return $p;
2828
+    return $p;
2829 2829
 }
2830 2830
 
2831 2831
 /**
@@ -2844,13 +2844,13 @@  discard block
 block discarded – undo
2844 2844
  *     Pile complétée par le code à générer
2845 2845
  */
2846 2846
 function balise_LARGEUR_ECRAN_dist($p) {
2847
-	$_class = interprete_argument_balise(1, $p);
2848
-	if (!$_class) {
2849
-		$_class = 'null';
2850
-	}
2851
-	$p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2847
+    $_class = interprete_argument_balise(1, $p);
2848
+    if (!$_class) {
2849
+        $_class = 'null';
2850
+    }
2851
+    $p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2852 2852
 
2853
-	return $p;
2853
+    return $p;
2854 2854
 }
2855 2855
 
2856 2856
 
@@ -2866,14 +2866,14 @@  discard block
 block discarded – undo
2866 2866
  *     Pile complétée par le code à générer
2867 2867
  **/
2868 2868
 function balise_CONST_dist($p) {
2869
-	$_const = interprete_argument_balise(1, $p);
2870
-	if (!strlen($_const ?? '')) {
2871
-		$p->code = "''";
2872
-	}
2873
-	else {
2874
-		$p->code = "(defined($_const)?constant($_const):'')";
2875
-	}
2876
-	$p->interdire_scripts = false;
2877
-
2878
-	return $p;
2869
+    $_const = interprete_argument_balise(1, $p);
2870
+    if (!strlen($_const ?? '')) {
2871
+        $p->code = "''";
2872
+    }
2873
+    else {
2874
+        $p->code = "(defined($_const)?constant($_const):'')";
2875
+    }
2876
+    $p->interdire_scripts = false;
2877
+
2878
+    return $p;
2879 2879
 }
Please login to merge, or discard this patch.