Completed
Push — master ( a04e6b...ef338c )
by cam
01:24
created
ecrire/public/debusquer.php 1 patch
Indentation   +682 added lines, -682 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@  discard block
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 include_spip('public/decompiler');
@@ -66,136 +66,136 @@  discard block
 block discarded – undo
66 66
  *     - string si $message à false.
67 67
  **/
68 68
 function public_debusquer_dist($message = '', $lieu = '', $opt = []) {
69
-	static $tableau_des_erreurs = [];
70
-
71
-	// Pour des tests unitaires, pouvoir récupérer les erreurs générées
72
-	if (isset($opt['erreurs'])) {
73
-		if ($opt['erreurs'] == 'get') {
74
-			return $tableau_des_erreurs;
75
-		}
76
-		if ($opt['erreurs'] == 'reset') {
77
-			$tableau_des_erreurs = [];
78
-
79
-			return true;
80
-		}
81
-	}
82
-
83
-	// Erreur ou appel final ?
84
-	if ($message) {
85
-		$message = debusquer_compose_message($message);
86
-		$tableau_des_erreurs[] = [$message, $lieu];
87
-		set_request('var_mode', 'debug');
88
-		$GLOBALS['bouton_admin_debug'] = true;
89
-		// Permettre a la compil de continuer
90
-		if (is_object($lieu) and (!isset($lieu->code) or !$lieu->code)) {
91
-			$lieu->code = "''";
92
-		}
93
-		// forcer l'appel au debusqueur en cas de boucles infernales
94
-		$urgence = (_DEBUG_MAX_SQUELETTE_ERREURS and count($tableau_des_erreurs) > _DEBUG_MAX_SQUELETTE_ERREURS);
95
-		if (!$urgence) {
96
-			return;
97
-		}
98
-	}
99
-	if (empty($GLOBALS['debug_objets']['principal'])) {
100
-		// espace public ?
101
-		if (isset($GLOBALS['fond'])) {
102
-			$GLOBALS['debug_objets']['principal'] = $GLOBALS['fond'];
103
-		}
104
-	}
105
-
106
-	include_spip('inc/autoriser');
107
-	if (!autoriser('debug')) {
108
-		return;
109
-	}
110
-	include_spip('inc/headers');
111
-	include_spip('inc/filtres');
112
-
113
-	// en cas de squelette inclus,  virer le code de l'incluant:
114
-	// - il contient souvent une Div restreignant la largeur a 3 fois rien
115
-	// - ca fait 2 headers !
116
-	// sauf si l'on se trouve deja dans un flux compresse (plugin compresseur
117
-	// actif par exemple)
118
-	if (
119
-		ob_get_length()
120
-		and
121
-		!in_array('ob_gzhandler', ob_get_status())
122
-	) {
123
-		ob_end_clean();
124
-	}
125
-
126
-	lang_select($GLOBALS['visiteur_session']['lang']);
127
-	$fonc = _request('var_mode_objet');
128
-	$mode = _request('var_mode_affiche');
129
-	$self = str_replace("\\'", ''', self());
130
-	$self = parametre_url($self, 'var_mode', 'debug');
131
-
132
-	$res = debusquer_bandeau($tableau_des_erreurs)
133
-		. '<br />'
134
-		. debusquer_squelette($fonc, $mode, $self);
135
-
136
-	if (!_DIR_RESTREINT or headers_sent()) {
137
-		return $res;
138
-	}
139
-	if ($tableau_des_erreurs) {
140
-		http_response_code(503);
141
-	}
142
-
143
-	http_no_cache();
144
-	if (isset($_GET['var_profile'])) {
145
-		$titre = parametre_url($GLOBALS['REQUEST_URI'], 'var_profile', '');
146
-		$titre = parametre_url($titre, 'var_mode', '');
147
-	} else {
148
-		if (!$fonc) {
149
-			$fonc = $GLOBALS['debug_objets']['principal'];
150
-		}
151
-		$titre = !$mode ? $fonc : ($mode . (isset($GLOBALS['debug_objets']['sourcefile'][$fonc]) ? ' ' . $GLOBALS['debug_objets']['sourcefile'][$fonc] : ''));
152
-	}
153
-	if ($message === false) {
154
-		lang_select();
155
-
156
-		return debusquer_entete($titre, $res);
157
-	} else {
158
-		echo debusquer_entete($titre, $res);
159
-	}
160
-	exit;
69
+    static $tableau_des_erreurs = [];
70
+
71
+    // Pour des tests unitaires, pouvoir récupérer les erreurs générées
72
+    if (isset($opt['erreurs'])) {
73
+        if ($opt['erreurs'] == 'get') {
74
+            return $tableau_des_erreurs;
75
+        }
76
+        if ($opt['erreurs'] == 'reset') {
77
+            $tableau_des_erreurs = [];
78
+
79
+            return true;
80
+        }
81
+    }
82
+
83
+    // Erreur ou appel final ?
84
+    if ($message) {
85
+        $message = debusquer_compose_message($message);
86
+        $tableau_des_erreurs[] = [$message, $lieu];
87
+        set_request('var_mode', 'debug');
88
+        $GLOBALS['bouton_admin_debug'] = true;
89
+        // Permettre a la compil de continuer
90
+        if (is_object($lieu) and (!isset($lieu->code) or !$lieu->code)) {
91
+            $lieu->code = "''";
92
+        }
93
+        // forcer l'appel au debusqueur en cas de boucles infernales
94
+        $urgence = (_DEBUG_MAX_SQUELETTE_ERREURS and count($tableau_des_erreurs) > _DEBUG_MAX_SQUELETTE_ERREURS);
95
+        if (!$urgence) {
96
+            return;
97
+        }
98
+    }
99
+    if (empty($GLOBALS['debug_objets']['principal'])) {
100
+        // espace public ?
101
+        if (isset($GLOBALS['fond'])) {
102
+            $GLOBALS['debug_objets']['principal'] = $GLOBALS['fond'];
103
+        }
104
+    }
105
+
106
+    include_spip('inc/autoriser');
107
+    if (!autoriser('debug')) {
108
+        return;
109
+    }
110
+    include_spip('inc/headers');
111
+    include_spip('inc/filtres');
112
+
113
+    // en cas de squelette inclus,  virer le code de l'incluant:
114
+    // - il contient souvent une Div restreignant la largeur a 3 fois rien
115
+    // - ca fait 2 headers !
116
+    // sauf si l'on se trouve deja dans un flux compresse (plugin compresseur
117
+    // actif par exemple)
118
+    if (
119
+        ob_get_length()
120
+        and
121
+        !in_array('ob_gzhandler', ob_get_status())
122
+    ) {
123
+        ob_end_clean();
124
+    }
125
+
126
+    lang_select($GLOBALS['visiteur_session']['lang']);
127
+    $fonc = _request('var_mode_objet');
128
+    $mode = _request('var_mode_affiche');
129
+    $self = str_replace("\\'", '&#39;', self());
130
+    $self = parametre_url($self, 'var_mode', 'debug');
131
+
132
+    $res = debusquer_bandeau($tableau_des_erreurs)
133
+        . '<br />'
134
+        . debusquer_squelette($fonc, $mode, $self);
135
+
136
+    if (!_DIR_RESTREINT or headers_sent()) {
137
+        return $res;
138
+    }
139
+    if ($tableau_des_erreurs) {
140
+        http_response_code(503);
141
+    }
142
+
143
+    http_no_cache();
144
+    if (isset($_GET['var_profile'])) {
145
+        $titre = parametre_url($GLOBALS['REQUEST_URI'], 'var_profile', '');
146
+        $titre = parametre_url($titre, 'var_mode', '');
147
+    } else {
148
+        if (!$fonc) {
149
+            $fonc = $GLOBALS['debug_objets']['principal'];
150
+        }
151
+        $titre = !$mode ? $fonc : ($mode . (isset($GLOBALS['debug_objets']['sourcefile'][$fonc]) ? ' ' . $GLOBALS['debug_objets']['sourcefile'][$fonc] : ''));
152
+    }
153
+    if ($message === false) {
154
+        lang_select();
155
+
156
+        return debusquer_entete($titre, $res);
157
+    } else {
158
+        echo debusquer_entete($titre, $res);
159
+    }
160
+    exit;
161 161
 }
162 162
 
163 163
 function debusquer_compose_message($msg) {
164
-	if (is_array($msg)) {
165
-		// si c'est un texte, c'est une traduction a faire, mais
166
-		// sqlite renvoit aussi des erreurs alpha num (mais avec 3 arguments)
167
-		if (!is_numeric($msg[0]) and count($msg) == 2) {
168
-			// message avec argument: instancier
169
-			$msg = _T($msg[0], $msg[1], 'spip-debug-arg');
170
-		} else {
171
-			// message SQL: interpreter
172
-			$msg = debusquer_requete($msg);
173
-		}
174
-	}
175
-	// FIXME: le fond n'est pas la si on n'est pas dans un squelette
176
-	// cela dit, ca serait bien d'indiquer tout de meme d'ou vient l'erreur
177
-	$fond = isset($GLOBALS['fond']) ? $GLOBALS['fond'] : '';
178
-	// une erreur critique sort $message en array
179
-	$debug = is_array($msg) ? $msg[1] : $msg;
180
-	spip_log('Debug: ' . $debug . ' (' . $fond . ')');
181
-
182
-	return $msg;
164
+    if (is_array($msg)) {
165
+        // si c'est un texte, c'est une traduction a faire, mais
166
+        // sqlite renvoit aussi des erreurs alpha num (mais avec 3 arguments)
167
+        if (!is_numeric($msg[0]) and count($msg) == 2) {
168
+            // message avec argument: instancier
169
+            $msg = _T($msg[0], $msg[1], 'spip-debug-arg');
170
+        } else {
171
+            // message SQL: interpreter
172
+            $msg = debusquer_requete($msg);
173
+        }
174
+    }
175
+    // FIXME: le fond n'est pas la si on n'est pas dans un squelette
176
+    // cela dit, ca serait bien d'indiquer tout de meme d'ou vient l'erreur
177
+    $fond = isset($GLOBALS['fond']) ? $GLOBALS['fond'] : '';
178
+    // une erreur critique sort $message en array
179
+    $debug = is_array($msg) ? $msg[1] : $msg;
180
+    spip_log('Debug: ' . $debug . ' (' . $fond . ')');
181
+
182
+    return $msg;
183 183
 }
184 184
 
185 185
 function debusquer_bandeau($erreurs) {
186 186
 
187
-	if (!empty($erreurs)) {
188
-		$n = [count($erreurs) . ' ' . _T('zbug_erreur_squelette')];
187
+    if (!empty($erreurs)) {
188
+        $n = [count($erreurs) . ' ' . _T('zbug_erreur_squelette')];
189 189
 
190
-		return debusquer_navigation($erreurs, $n);
191
-	} elseif (!empty($GLOBALS['tableau_des_temps'])) {
192
-		include_spip('public/tracer');
193
-		list($temps, $nav) = chrono_requete($GLOBALS['tableau_des_temps']);
190
+        return debusquer_navigation($erreurs, $n);
191
+    } elseif (!empty($GLOBALS['tableau_des_temps'])) {
192
+        include_spip('public/tracer');
193
+        list($temps, $nav) = chrono_requete($GLOBALS['tableau_des_temps']);
194 194
 
195
-		return debusquer_navigation($temps, $nav, 'debug-profile');
196
-	} else {
197
-		return '';
198
-	}
195
+        return debusquer_navigation($temps, $nav, 'debug-profile');
196
+    } else {
197
+        return '';
198
+    }
199 199
 }
200 200
 
201 201
 /**
@@ -205,42 +205,42 @@  discard block
 block discarded – undo
205 205
  * @return string Code HTML
206 206
  **/
207 207
 function debusquer_contexte($env) {
208
-	if (is_string($env) and is_array($env_tab = @unserialize($env))) {
209
-		$env = $env_tab;
210
-	}
211
-
212
-	if (!$env) {
213
-		return '';
214
-	}
215
-	$res = '';
216
-	foreach ($env as $nom => $valeur) {
217
-		if (is_array($valeur)) {
218
-			$valeur_simple = [];
219
-			foreach ($valeur as $v) {
220
-				if (is_array($v)) {
221
-					$valeur_simple[] = 'array:' . count($v);
222
-				} elseif (is_object($v)) {
223
-					$valeur_simple[] = get_class($v);
224
-				} elseif (is_string($v)) {
225
-					$valeur_simple[] = "'" . $v . "'";
226
-				} else {
227
-					$valeur_simple[] = $v;
228
-				}
229
-			}
230
-			$n = count($valeur);
231
-			$valeur = (($n > 3) ? 'array:' . $n . ' ' : '');
232
-			$valeur .= '[' . join(', ', $valeur_simple) . ']';
233
-		} elseif (is_object($valeur)) {
234
-			$valeur = get_class($valeur);
235
-		} elseif (is_string($valeur)) {
236
-			$valeur = "'" . $valeur . "'";
237
-		}
238
-		$res .= "\n<tr><td><strong>" . nl2br(entites_html($nom))
239
-			. '</strong></td><td>:&nbsp;' . nl2br(entites_html($valeur))
240
-			. "</td></tr>\n";
241
-	}
242
-
243
-	return "<div class='spip-env'><fieldset><legend onclick=\"this.parentElement.classList.toggle('expanded');\">#ENV</legend>\n<div><table>$res</table></div></fieldset></div>\n";
208
+    if (is_string($env) and is_array($env_tab = @unserialize($env))) {
209
+        $env = $env_tab;
210
+    }
211
+
212
+    if (!$env) {
213
+        return '';
214
+    }
215
+    $res = '';
216
+    foreach ($env as $nom => $valeur) {
217
+        if (is_array($valeur)) {
218
+            $valeur_simple = [];
219
+            foreach ($valeur as $v) {
220
+                if (is_array($v)) {
221
+                    $valeur_simple[] = 'array:' . count($v);
222
+                } elseif (is_object($v)) {
223
+                    $valeur_simple[] = get_class($v);
224
+                } elseif (is_string($v)) {
225
+                    $valeur_simple[] = "'" . $v . "'";
226
+                } else {
227
+                    $valeur_simple[] = $v;
228
+                }
229
+            }
230
+            $n = count($valeur);
231
+            $valeur = (($n > 3) ? 'array:' . $n . ' ' : '');
232
+            $valeur .= '[' . join(', ', $valeur_simple) . ']';
233
+        } elseif (is_object($valeur)) {
234
+            $valeur = get_class($valeur);
235
+        } elseif (is_string($valeur)) {
236
+            $valeur = "'" . $valeur . "'";
237
+        }
238
+        $res .= "\n<tr><td><strong>" . nl2br(entites_html($nom))
239
+            . '</strong></td><td>:&nbsp;' . nl2br(entites_html($valeur))
240
+            . "</td></tr>\n";
241
+    }
242
+
243
+    return "<div class='spip-env'><fieldset><legend onclick=\"this.parentElement.classList.toggle('expanded');\">#ENV</legend>\n<div><table>$res</table></div></fieldset></div>\n";
244 244
 }
245 245
 
246 246
 // Affichage du tableau des erreurs ou des temps de calcul
@@ -248,66 +248,66 @@  discard block
 block discarded – undo
248 248
 
249 249
 function debusquer_navigation($tableau, $caption = [], $id = 'debug-nav') {
250 250
 
251
-	if (_request('exec') == 'valider_xml') {
252
-		return '';
253
-	}
254
-	$GLOBALS['bouton_admin_debug'] = true;
255
-	$res = '';
256
-	$href = quote_amp(parametre_url($GLOBALS['REQUEST_URI'], 'var_mode', 'debug'));
257
-	foreach ($tableau as $i => $err) {
258
-		$boucle = $ligne = $skel = '';
259
-		list($msg, $lieu) = $err;
260
-		if (is_object($lieu)) {
261
-			$ligne = $lieu->ligne;
262
-			$boucle = !empty($lieu->id_boucle) ? $lieu->id_boucle : '';
263
-			if (isset($lieu->descr['nom'])) {
264
-				$nom_code = $lieu->descr['nom'];
265
-				$skel = $lieu->descr['sourcefile'];
266
-				$h2 = parametre_url($href, 'var_mode_objet', $nom_code);
267
-				$h3 = parametre_url($h2, 'var_mode_affiche', 'squelette') . '#L' . $ligne;
268
-				$skel = "<a href='$h3'><b>$skel</b></a>";
269
-				if ($boucle) {
270
-					$h3 = parametre_url($h2 . $boucle, 'var_mode_affiche', 'boucle');
271
-					$boucle = "<a href='$h3'><b>$boucle</b></a>";
272
-				}
273
-			}
274
-		}
275
-
276
-		$j = ($i + 1);
277
-		$res .= "<tr id='req$j'><td style='text-align: right'>"
278
-			. $j
279
-			. "&nbsp;</td><td style='text-align: left'>"
280
-			. (is_array($msg) ? implode('', $msg) : $msg)
281
-			. "</td><td style='text-align: left'>"
282
-			. ($skel ? $skel : '&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;')
283
-			. "</td><td class='spip-debug-arg' style='text-align: left'>"
284
-			. ($boucle ? $boucle : '&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;')
285
-			. "</td><td style='text-align: right'>"
286
-			. $ligne
287
-			. "</td></tr>\n";
288
-	}
289
-
290
-	return "\n<table id='$id'>"
291
-	. "<caption onclick=\"x = document.getElementById('$id'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\">"
292
-	. $caption[0]
251
+    if (_request('exec') == 'valider_xml') {
252
+        return '';
253
+    }
254
+    $GLOBALS['bouton_admin_debug'] = true;
255
+    $res = '';
256
+    $href = quote_amp(parametre_url($GLOBALS['REQUEST_URI'], 'var_mode', 'debug'));
257
+    foreach ($tableau as $i => $err) {
258
+        $boucle = $ligne = $skel = '';
259
+        list($msg, $lieu) = $err;
260
+        if (is_object($lieu)) {
261
+            $ligne = $lieu->ligne;
262
+            $boucle = !empty($lieu->id_boucle) ? $lieu->id_boucle : '';
263
+            if (isset($lieu->descr['nom'])) {
264
+                $nom_code = $lieu->descr['nom'];
265
+                $skel = $lieu->descr['sourcefile'];
266
+                $h2 = parametre_url($href, 'var_mode_objet', $nom_code);
267
+                $h3 = parametre_url($h2, 'var_mode_affiche', 'squelette') . '#L' . $ligne;
268
+                $skel = "<a href='$h3'><b>$skel</b></a>";
269
+                if ($boucle) {
270
+                    $h3 = parametre_url($h2 . $boucle, 'var_mode_affiche', 'boucle');
271
+                    $boucle = "<a href='$h3'><b>$boucle</b></a>";
272
+                }
273
+            }
274
+        }
275
+
276
+        $j = ($i + 1);
277
+        $res .= "<tr id='req$j'><td style='text-align: right'>"
278
+            . $j
279
+            . "&nbsp;</td><td style='text-align: left'>"
280
+            . (is_array($msg) ? implode('', $msg) : $msg)
281
+            . "</td><td style='text-align: left'>"
282
+            . ($skel ? $skel : '&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;')
283
+            . "</td><td class='spip-debug-arg' style='text-align: left'>"
284
+            . ($boucle ? $boucle : '&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;')
285
+            . "</td><td style='text-align: right'>"
286
+            . $ligne
287
+            . "</td></tr>\n";
288
+    }
289
+
290
+    return "\n<table id='$id'>"
291
+    . "<caption onclick=\"x = document.getElementById('$id'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\">"
292
+    . $caption[0]
293 293
 ## aide locale courte a ecrire, avec lien vers une grosse page de documentation
294 294
 #		aider('erreur_compilation'),
295
-	. '</caption>'
296
-	//  fausse caption du chrono (mais vraie nav)
297
-	. (!empty($caption[1]) ? $caption[1] : '')
298
-	. '<tr><th>'
299
-	. _T('numero')
300
-	. '</th><th>'
301
-	. _T('public:message')
302
-	. '</th><th>'
303
-	. _T('squelette')
304
-	. '</th><th>'
305
-	. _T('zbug_boucle')
306
-	. '</th><th>'
307
-	. _T('ligne')
308
-	. '</th></tr>'
309
-	. $res
310
-	. '</table>';
295
+    . '</caption>'
296
+    //  fausse caption du chrono (mais vraie nav)
297
+    . (!empty($caption[1]) ? $caption[1] : '')
298
+    . '<tr><th>'
299
+    . _T('numero')
300
+    . '</th><th>'
301
+    . _T('public:message')
302
+    . '</th><th>'
303
+    . _T('squelette')
304
+    . '</th><th>'
305
+    . _T('zbug_boucle')
306
+    . '</th><th>'
307
+    . _T('ligne')
308
+    . '</th></tr>'
309
+    . $res
310
+    . '</table>';
311 311
 }
312 312
 
313 313
 
@@ -327,124 +327,124 @@  discard block
 block discarded – undo
327 327
  *    ou un tableau si l'erreur est critique
328 328
  **/
329 329
 function debusquer_requete($message) {
330
-	list($errno, $msg, $query) = $message;
331
-
332
-	// FIXME: ces écritures mélangent divers syntaxe des moteurs SQL
333
-	// il serait plus prudent certainement d'avoir une fonction d'analyse par moteur
334
-	if (preg_match(',err(no|code):?[[:space:]]*([0-9]+),i', $msg, $regs)) {
335
-		$errno = $regs[2];
336
-	} elseif (
337
-		is_numeric($errno) and ($errno == 1030 or $errno <= 1026)
338
-		and preg_match(',[^[:alnum:]]([0-9]+)[^[:alnum:]],', $msg, $regs)
339
-	) {
340
-		$errno = $regs[1];
341
-	}
342
-
343
-	// Erreur systeme
344
-	if (is_numeric($errno) and $errno > 0 and $errno < 200) {
345
-		$retour = '<tt><br /><br /><blink>'
346
-			. _T('info_erreur_systeme', ['errsys' => $errno])
347
-			. "</blink><br />\n<b>"
348
-			. _T(
349
-				'info_erreur_systeme2',
350
-				['script' => generer_url_ecrire('base_repair')]
351
-			)
352
-			. '</b><br />';
353
-		spip_log("Erreur systeme $errno");
354
-
355
-		return [$retour, ''];
356
-	}
357
-
358
-	// Requete erronee
359
-	$err = '<b>' . _T('avis_erreur_mysql') . " $errno</b><br /><tt>\n"
360
-		. spip_htmlspecialchars($msg)
361
-		. "\n<br /><span style='color: red'><b>"
362
-		. spip_htmlspecialchars($query)
363
-		. '</b></span></tt><br />';
364
-
365
-	//. aider('erreur_mysql');
366
-
367
-	return $err;
330
+    list($errno, $msg, $query) = $message;
331
+
332
+    // FIXME: ces écritures mélangent divers syntaxe des moteurs SQL
333
+    // il serait plus prudent certainement d'avoir une fonction d'analyse par moteur
334
+    if (preg_match(',err(no|code):?[[:space:]]*([0-9]+),i', $msg, $regs)) {
335
+        $errno = $regs[2];
336
+    } elseif (
337
+        is_numeric($errno) and ($errno == 1030 or $errno <= 1026)
338
+        and preg_match(',[^[:alnum:]]([0-9]+)[^[:alnum:]],', $msg, $regs)
339
+    ) {
340
+        $errno = $regs[1];
341
+    }
342
+
343
+    // Erreur systeme
344
+    if (is_numeric($errno) and $errno > 0 and $errno < 200) {
345
+        $retour = '<tt><br /><br /><blink>'
346
+            . _T('info_erreur_systeme', ['errsys' => $errno])
347
+            . "</blink><br />\n<b>"
348
+            . _T(
349
+                'info_erreur_systeme2',
350
+                ['script' => generer_url_ecrire('base_repair')]
351
+            )
352
+            . '</b><br />';
353
+        spip_log("Erreur systeme $errno");
354
+
355
+        return [$retour, ''];
356
+    }
357
+
358
+    // Requete erronee
359
+    $err = '<b>' . _T('avis_erreur_mysql') . " $errno</b><br /><tt>\n"
360
+        . spip_htmlspecialchars($msg)
361
+        . "\n<br /><span style='color: red'><b>"
362
+        . spip_htmlspecialchars($query)
363
+        . '</b></span></tt><br />';
364
+
365
+    //. aider('erreur_mysql');
366
+
367
+    return $err;
368 368
 }
369 369
 
370 370
 
371 371
 // https://code.spip.net/@trouve_boucle_debug
372 372
 function trouve_boucle_debug($n, $nom, $debut = 0, $boucle = '') {
373 373
 
374
-	$id = $nom . $boucle;
375
-	if (is_array($GLOBALS['debug_objets']['sequence'][$id])) {
376
-		foreach ($GLOBALS['debug_objets']['sequence'][$id] as $v) {
377
-			if (!preg_match('/^(.*)(<\?.*\?>)(.*)$/s', $v[0], $r)) {
378
-				$y = substr_count($v[0], "\n");
379
-			} else {
380
-				if ($v[1][0] == '#') { // balise dynamique
381
-				$incl = $GLOBALS['debug_objets']['resultat'][$v[2]];
382
-				} else // inclusion
383
-				{
384
-					$incl = $GLOBALS['debug_objets']['squelette'][trouve_squelette_inclus($v[0])];
385
-				}
386
-				$y = substr_count($incl, "\n")
387
-					+ substr_count($r[1], "\n")
388
-					+ substr_count($r[3], "\n");
389
-			}
390
-			if ($n <= ($y + $debut)) {
391
-				if ($v[1][0] == '?') {
392
-					return trouve_boucle_debug($n, $nom, $debut, substr($v[1], 1));
393
-				} elseif ($v[1][0] == '!') {
394
-					if ($incl = trouve_squelette_inclus($v[1])) {
395
-						return trouve_boucle_debug($n, $incl, $debut);
396
-					}
397
-				}
398
-
399
-				return [$nom, $boucle, $v[2] - 1 + $n - $debut];
400
-			}
401
-			$debut += $y;
402
-		}
403
-	}
404
-
405
-	return [$nom, $boucle, $n - $debut];
374
+    $id = $nom . $boucle;
375
+    if (is_array($GLOBALS['debug_objets']['sequence'][$id])) {
376
+        foreach ($GLOBALS['debug_objets']['sequence'][$id] as $v) {
377
+            if (!preg_match('/^(.*)(<\?.*\?>)(.*)$/s', $v[0], $r)) {
378
+                $y = substr_count($v[0], "\n");
379
+            } else {
380
+                if ($v[1][0] == '#') { // balise dynamique
381
+                $incl = $GLOBALS['debug_objets']['resultat'][$v[2]];
382
+                } else // inclusion
383
+                {
384
+                    $incl = $GLOBALS['debug_objets']['squelette'][trouve_squelette_inclus($v[0])];
385
+                }
386
+                $y = substr_count($incl, "\n")
387
+                    + substr_count($r[1], "\n")
388
+                    + substr_count($r[3], "\n");
389
+            }
390
+            if ($n <= ($y + $debut)) {
391
+                if ($v[1][0] == '?') {
392
+                    return trouve_boucle_debug($n, $nom, $debut, substr($v[1], 1));
393
+                } elseif ($v[1][0] == '!') {
394
+                    if ($incl = trouve_squelette_inclus($v[1])) {
395
+                        return trouve_boucle_debug($n, $incl, $debut);
396
+                    }
397
+                }
398
+
399
+                return [$nom, $boucle, $v[2] - 1 + $n - $debut];
400
+            }
401
+            $debut += $y;
402
+        }
403
+    }
404
+
405
+    return [$nom, $boucle, $n - $debut];
406 406
 }
407 407
 
408 408
 // https://code.spip.net/@trouve_squelette_inclus
409 409
 function trouve_squelette_inclus($script) {
410 410
 
411
-	preg_match('/include\(.(.*).php3?.\);/', $script, $reg);
412
-	// si le script X.php n'est pas ecrire/public.php
413
-	// on suppose qu'il prend le squelette X.html (pas sur, mais y a pas mieux)
414
-	if ($reg[1] == 'ecrire/public') { // si c'est bien ecrire/public on cherche le param 'fond'
415
-	if (!preg_match("/'fond' => '([^']*)'/", $script, $reg)) { // a defaut on cherche le param 'page'
416
-		if (!preg_match("/'param' => '([^']*)'/", $script, $reg)) {
417
-				$reg[1] = 'inconnu';
418
-		}
419
-	}
420
-	}
421
-	$incl = ',' . $reg[1] . '[.]\w$,';
422
-
423
-	foreach ($GLOBALS['debug_objets']['sourcefile'] as $k => $v) {
424
-		if (preg_match($incl, $v)) {
425
-			return $k;
426
-		}
427
-	}
428
-
429
-	return '';
411
+    preg_match('/include\(.(.*).php3?.\);/', $script, $reg);
412
+    // si le script X.php n'est pas ecrire/public.php
413
+    // on suppose qu'il prend le squelette X.html (pas sur, mais y a pas mieux)
414
+    if ($reg[1] == 'ecrire/public') { // si c'est bien ecrire/public on cherche le param 'fond'
415
+    if (!preg_match("/'fond' => '([^']*)'/", $script, $reg)) { // a defaut on cherche le param 'page'
416
+        if (!preg_match("/'param' => '([^']*)'/", $script, $reg)) {
417
+                $reg[1] = 'inconnu';
418
+        }
419
+    }
420
+    }
421
+    $incl = ',' . $reg[1] . '[.]\w$,';
422
+
423
+    foreach ($GLOBALS['debug_objets']['sourcefile'] as $k => $v) {
424
+        if (preg_match($incl, $v)) {
425
+            return $k;
426
+        }
427
+    }
428
+
429
+    return '';
430 430
 }
431 431
 
432 432
 // https://code.spip.net/@reference_boucle_debug
433 433
 function reference_boucle_debug($n, $nom, $self) {
434
-	list($skel, $boucle, $ligne) = trouve_boucle_debug($n, $nom);
435
-
436
-	if (!$boucle) {
437
-		return !$ligne ? '' :
438
-			(' (' .
439
-				(($nom != $skel) ? _T('squelette_inclus_ligne') :
440
-					_T('squelette_ligne')) .
441
-				" <a href='$self&amp;var_mode_objet=$skel&amp;var_mode_affiche=squelette&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)");
442
-	} else {
443
-		$self .= "&amp;var_mode_objet=$skel$boucle&amp;var_mode_affiche=boucle";
444
-
445
-		return !$ligne ? " (boucle\n<a href='$self#$skel$boucle'>$boucle</a>)" :
446
-			" (boucle $boucle ligne\n<a href='$self&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)";
447
-	}
434
+    list($skel, $boucle, $ligne) = trouve_boucle_debug($n, $nom);
435
+
436
+    if (!$boucle) {
437
+        return !$ligne ? '' :
438
+            (' (' .
439
+                (($nom != $skel) ? _T('squelette_inclus_ligne') :
440
+                    _T('squelette_ligne')) .
441
+                " <a href='$self&amp;var_mode_objet=$skel&amp;var_mode_affiche=squelette&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)");
442
+    } else {
443
+        $self .= "&amp;var_mode_objet=$skel$boucle&amp;var_mode_affiche=boucle";
444
+
445
+        return !$ligne ? " (boucle\n<a href='$self#$skel$boucle'>$boucle</a>)" :
446
+            " (boucle $boucle ligne\n<a href='$self&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)";
447
+    }
448 448
 }
449 449
 
450 450
 // affiche un texte avec numero de ligne et ancre.
@@ -452,397 +452,397 @@  discard block
 block discarded – undo
452 452
 // https://code.spip.net/@ancre_texte
453 453
 function ancre_texte($texte, $fautifs = [], $nocpt = false) {
454 454
 
455
-	$var_mode_ligne = _request('var_mode_ligne');
456
-	if ($var_mode_ligne) {
457
-		$fautifs[] = [$var_mode_ligne];
458
-	}
459
-	$res = '';
460
-
461
-	$s = highlight_string($texte, true);
462
-	if (substr($s, 0, 6) == '<code>') {
463
-		$s = substr($s, 6);
464
-		$res = '<code>';
465
-	}
466
-
467
-	$s = preg_replace(
468
-		',<(\w[^<>]*)>([^<]*)<br />([^<]*)</\1>,',
469
-		'<\1>\2</\1><br />' . "\n" . '<\1>\3</\1>',
470
-		$s
471
-	);
472
-
473
-
474
-	$tableau = explode('<br />', $s);
475
-
476
-	$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" . strval(@strlen(count($tableau))) . "d</a></span> %s<br />\n";
477
-
478
-	$format10 = str_replace('white', 'lightgrey', $format);
479
-	$formaterr = 'color: red;';
480
-	$i = 1;
481
-	$flignes = [];
482
-	$loc = [0, 0];
483
-	foreach ($fautifs as $lc) {
484
-		if (is_array($lc)) {
485
-			$l = array_shift($lc);
486
-			$flignes[$l] = $lc;
487
-		} else {
488
-			$flignes[$lc] = $loc;
489
-		}
490
-	}
491
-
492
-	$ancre = md5($texte);
493
-	foreach ($tableau as $ligne) {
494
-		if (isset($flignes[$i])) {
495
-			$ligne = str_replace('&nbsp;', ' ', $ligne);
496
-			$indexmesg = $flignes[$i][1];
497
-			$err = textebrut($flignes[$i][2]);
498
-			// tentative de pointer sur la colonne fautive;
499
-			// marche pas car highlight_string rajoute des entites. A revoir.
500
-			// $m = $flignes[$i][0];
501
-			// $ligne = substr($ligne, 0, $m-1) .
502
-			// sprintf($formaterr, substr($ligne,$m));
503
-			$bg = $formaterr;
504
-		} else {
505
-			$indexmesg = $ancre;
506
-			$err = $bg = '';
507
-		}
508
-		$res .= sprintf((($i % 10) ? $format : $format10), $i, $bg, $indexmesg, $err, $i, $ligne);
509
-		$i++;
510
-	}
511
-
512
-	return "<div id='T$ancre'>"
513
-	. '<div onclick="'
514
-	. "jQuery(this).parent().find('a').toggle();"
515
-	. '" title="'
516
-	. _T('masquer_colonne')
517
-	. '" style="cursor: pointer;">'
518
-	. ($nocpt ? '' : _T('info_numero_abbreviation'))
519
-	. '</div>
455
+    $var_mode_ligne = _request('var_mode_ligne');
456
+    if ($var_mode_ligne) {
457
+        $fautifs[] = [$var_mode_ligne];
458
+    }
459
+    $res = '';
460
+
461
+    $s = highlight_string($texte, true);
462
+    if (substr($s, 0, 6) == '<code>') {
463
+        $s = substr($s, 6);
464
+        $res = '<code>';
465
+    }
466
+
467
+    $s = preg_replace(
468
+        ',<(\w[^<>]*)>([^<]*)<br />([^<]*)</\1>,',
469
+        '<\1>\2</\1><br />' . "\n" . '<\1>\3</\1>',
470
+        $s
471
+    );
472
+
473
+
474
+    $tableau = explode('<br />', $s);
475
+
476
+    $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" . strval(@strlen(count($tableau))) . "d</a></span> %s<br />\n";
477
+
478
+    $format10 = str_replace('white', 'lightgrey', $format);
479
+    $formaterr = 'color: red;';
480
+    $i = 1;
481
+    $flignes = [];
482
+    $loc = [0, 0];
483
+    foreach ($fautifs as $lc) {
484
+        if (is_array($lc)) {
485
+            $l = array_shift($lc);
486
+            $flignes[$l] = $lc;
487
+        } else {
488
+            $flignes[$lc] = $loc;
489
+        }
490
+    }
491
+
492
+    $ancre = md5($texte);
493
+    foreach ($tableau as $ligne) {
494
+        if (isset($flignes[$i])) {
495
+            $ligne = str_replace('&nbsp;', ' ', $ligne);
496
+            $indexmesg = $flignes[$i][1];
497
+            $err = textebrut($flignes[$i][2]);
498
+            // tentative de pointer sur la colonne fautive;
499
+            // marche pas car highlight_string rajoute des entites. A revoir.
500
+            // $m = $flignes[$i][0];
501
+            // $ligne = substr($ligne, 0, $m-1) .
502
+            // sprintf($formaterr, substr($ligne,$m));
503
+            $bg = $formaterr;
504
+        } else {
505
+            $indexmesg = $ancre;
506
+            $err = $bg = '';
507
+        }
508
+        $res .= sprintf((($i % 10) ? $format : $format10), $i, $bg, $indexmesg, $err, $i, $ligne);
509
+        $i++;
510
+    }
511
+
512
+    return "<div id='T$ancre'>"
513
+    . '<div onclick="'
514
+    . "jQuery(this).parent().find('a').toggle();"
515
+    . '" title="'
516
+    . _T('masquer_colonne')
517
+    . '" style="cursor: pointer;">'
518
+    . ($nocpt ? '' : _T('info_numero_abbreviation'))
519
+    . '</div>
520 520
 	' . $res . "</div>\n";
521 521
 }
522 522
 
523 523
 // l'environnement graphique du debuggueur
524 524
 
525 525
 function debusquer_squelette($fonc, $mode, $self) {
526
-	$texte = '';
527
-
528
-	if ($mode !== 'validation') {
529
-		if (isset($GLOBALS['debug_objets']['sourcefile']) and $GLOBALS['debug_objets']['sourcefile']) {
530
-			$res = "<div id='spip-boucles'>\n"
531
-				. debusquer_navigation_squelettes($self)
532
-				. '</div>';
533
-		} else {
534
-			$res = '';
535
-		}
536
-		if ($fonc) {
537
-			$id = " id='$fonc'";
538
-			if (!empty($GLOBALS['debug_objets'][$mode][$fonc])) {
539
-				list($legend, $texte, $res2) = debusquer_source($fonc, $mode);
540
-				$texte .= $res2;
541
-			} elseif (!empty($GLOBALS['debug_objets'][$mode][$fonc . 'tout'])) {
542
-				$legend = _T('zbug_' . $mode);
543
-				$texte = $GLOBALS['debug_objets'][$mode][$fonc . 'tout'];
544
-				$texte = ancre_texte($texte, ['', '']);
545
-			}
546
-		} else {
547
-			if (strlen(trim($res))) {
548
-				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>";
549
-			} else {
550
-				// cas de l'appel sur erreur: montre la page
551
-				return isset($GLOBALS['debug_objets']['resultat']['tout'])
552
-					? $GLOBALS['debug_objets']['resultat']['tout']
553
-					: '';
554
-			}
555
-		}
556
-	} else {
557
-		$valider = charger_fonction('valider', 'xml');
558
-		$val = $valider($GLOBALS['debug_objets']['validation'][$fonc . 'tout']);
559
-		// Si erreur, signaler leur nombre dans le formulaire admin
560
-		$GLOBALS['debug_objets']['validation'] = $val->err ? count($val->err) : '';
561
-		list($texte, $err) = emboite_texte($val, $fonc, $self);
562
-		if ($err === false) {
563
-			$err = _T('impossible');
564
-		} elseif ($err === true) {
565
-			$err = _T('correcte');
566
-		} else {
567
-			$err = ": $err";
568
-		}
569
-		$legend = _T('validation') . ' ' . $err;
570
-		$res = $id = '';
571
-	}
572
-
573
-	return !trim($texte) ? '' : (
574
-		"<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"
575
-		. "<div id='debug_boucle'><fieldset$id><legend>"
576
-		. "<a href='" . $self . '#f_' . substr($fonc, 0, 37) . "'> &#8593; "
577
-		. ($legend ? $legend : $mode)
578
-		. '</a></legend>'
579
-		. $texte
580
-		. '</fieldset></div>'
581
-		. '</div>');
526
+    $texte = '';
527
+
528
+    if ($mode !== 'validation') {
529
+        if (isset($GLOBALS['debug_objets']['sourcefile']) and $GLOBALS['debug_objets']['sourcefile']) {
530
+            $res = "<div id='spip-boucles'>\n"
531
+                . debusquer_navigation_squelettes($self)
532
+                . '</div>';
533
+        } else {
534
+            $res = '';
535
+        }
536
+        if ($fonc) {
537
+            $id = " id='$fonc'";
538
+            if (!empty($GLOBALS['debug_objets'][$mode][$fonc])) {
539
+                list($legend, $texte, $res2) = debusquer_source($fonc, $mode);
540
+                $texte .= $res2;
541
+            } elseif (!empty($GLOBALS['debug_objets'][$mode][$fonc . 'tout'])) {
542
+                $legend = _T('zbug_' . $mode);
543
+                $texte = $GLOBALS['debug_objets'][$mode][$fonc . 'tout'];
544
+                $texte = ancre_texte($texte, ['', '']);
545
+            }
546
+        } else {
547
+            if (strlen(trim($res))) {
548
+                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>";
549
+            } else {
550
+                // cas de l'appel sur erreur: montre la page
551
+                return isset($GLOBALS['debug_objets']['resultat']['tout'])
552
+                    ? $GLOBALS['debug_objets']['resultat']['tout']
553
+                    : '';
554
+            }
555
+        }
556
+    } else {
557
+        $valider = charger_fonction('valider', 'xml');
558
+        $val = $valider($GLOBALS['debug_objets']['validation'][$fonc . 'tout']);
559
+        // Si erreur, signaler leur nombre dans le formulaire admin
560
+        $GLOBALS['debug_objets']['validation'] = $val->err ? count($val->err) : '';
561
+        list($texte, $err) = emboite_texte($val, $fonc, $self);
562
+        if ($err === false) {
563
+            $err = _T('impossible');
564
+        } elseif ($err === true) {
565
+            $err = _T('correcte');
566
+        } else {
567
+            $err = ": $err";
568
+        }
569
+        $legend = _T('validation') . ' ' . $err;
570
+        $res = $id = '';
571
+    }
572
+
573
+    return !trim($texte) ? '' : (
574
+        "<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"
575
+        . "<div id='debug_boucle'><fieldset$id><legend>"
576
+        . "<a href='" . $self . '#f_' . substr($fonc, 0, 37) . "'> &#8593; "
577
+        . ($legend ? $legend : $mode)
578
+        . '</a></legend>'
579
+        . $texte
580
+        . '</fieldset></div>'
581
+        . '</div>');
582 582
 }
583 583
 
584 584
 
585 585
 // https://code.spip.net/@emboite_texte
586 586
 function emboite_texte($res, $fonc = '', $self = '') {
587
-	$errs = $res->err;
588
-	$texte = $res->entete . ($errs ? '' : $res->page);
589
-
590
-	if (!$texte and !$errs) {
591
-		return [ancre_texte('', ['', '']), false];
592
-	}
593
-	if (!$errs) {
594
-		return [ancre_texte($texte, ['', '']), true];
595
-	}
596
-
597
-	if (!isset($GLOBALS['debug_objets'])) {
598
-		$colors = ['#e0e0f0', '#f8f8ff'];
599
-		$encore = count_occ($errs);
600
-		$encore2 = [];
601
-		$fautifs = [];
602
-
603
-		$err = '<tr><th>'
604
-			. _T('numero')
605
-			. '</th><th>'
606
-			. _T('occurence')
607
-			. '</th><th>'
608
-			. _T('ligne')
609
-			. '</th><th>'
610
-			. _T('colonne')
611
-			. '</th><th>'
612
-			. _T('erreur')
613
-			. '</th></tr>';
614
-
615
-		$i = 0;
616
-		$style = "style='text-align: right; padding-right: 5px'";
617
-		foreach ($errs as $r) {
618
-			$i++;
619
-			list($msg, $ligne, $col) = $r;
620
-			#spip_log("$r = list($msg, $ligne, $col");
621
-			if (isset($encore2[$msg])) {
622
-				$ref = ++$encore2[$msg];
623
-			} else {
624
-				$encore2[$msg] = $ref = 1;
625
-			}
626
-			$err .= "<tr  style='background-color: "
627
-				. $colors[$i % 2]
628
-				. "'><td $style><a href='#debut_err'>"
629
-				. $i
630
-				. "</a></td><td $style>"
631
-				. "$ref/$encore[$msg]</td>"
632
-				. "<td $style><a href='#L"
633
-				. $ligne
634
-				. "' id='T$i'>"
635
-				. $ligne
636
-				. "</a></td><td $style>"
637
-				. $col
638
-				. "</td><td>$msg</td></tr>\n";
639
-			$fautifs[] = [$ligne, $col, $i, $msg];
640
-		}
641
-		$err = "<h2 style='text-align: center'>"
642
-			. $i
643
-			. "<a href='#fin_err'>"
644
-			. ' ' . _T('erreur_texte')
645
-			. "</a></h2><table id='debut_err' style='width: 100%'>"
646
-			. $err
647
-			. " </table><a id='fin_err'></a>";
648
-
649
-		return [ancre_texte($texte, $fautifs), $err];
650
-	} else {
651
-		list($msg, $fermant, $ouvrant) = $errs[0];
652
-		$rf = reference_boucle_debug($fermant, $fonc, $self);
653
-		$ro = reference_boucle_debug($ouvrant, $fonc, $self);
654
-		$err = $msg .
655
-			"<a href='#L" . $fermant . "'>$fermant</a>$rf<br />" .
656
-			"<a href='#L" . $ouvrant . "'>$ouvrant</a>$ro";
657
-
658
-		return [ancre_texte($texte, [[$ouvrant], [$fermant]]), $err];
659
-	}
587
+    $errs = $res->err;
588
+    $texte = $res->entete . ($errs ? '' : $res->page);
589
+
590
+    if (!$texte and !$errs) {
591
+        return [ancre_texte('', ['', '']), false];
592
+    }
593
+    if (!$errs) {
594
+        return [ancre_texte($texte, ['', '']), true];
595
+    }
596
+
597
+    if (!isset($GLOBALS['debug_objets'])) {
598
+        $colors = ['#e0e0f0', '#f8f8ff'];
599
+        $encore = count_occ($errs);
600
+        $encore2 = [];
601
+        $fautifs = [];
602
+
603
+        $err = '<tr><th>'
604
+            . _T('numero')
605
+            . '</th><th>'
606
+            . _T('occurence')
607
+            . '</th><th>'
608
+            . _T('ligne')
609
+            . '</th><th>'
610
+            . _T('colonne')
611
+            . '</th><th>'
612
+            . _T('erreur')
613
+            . '</th></tr>';
614
+
615
+        $i = 0;
616
+        $style = "style='text-align: right; padding-right: 5px'";
617
+        foreach ($errs as $r) {
618
+            $i++;
619
+            list($msg, $ligne, $col) = $r;
620
+            #spip_log("$r = list($msg, $ligne, $col");
621
+            if (isset($encore2[$msg])) {
622
+                $ref = ++$encore2[$msg];
623
+            } else {
624
+                $encore2[$msg] = $ref = 1;
625
+            }
626
+            $err .= "<tr  style='background-color: "
627
+                . $colors[$i % 2]
628
+                . "'><td $style><a href='#debut_err'>"
629
+                . $i
630
+                . "</a></td><td $style>"
631
+                . "$ref/$encore[$msg]</td>"
632
+                . "<td $style><a href='#L"
633
+                . $ligne
634
+                . "' id='T$i'>"
635
+                . $ligne
636
+                . "</a></td><td $style>"
637
+                . $col
638
+                . "</td><td>$msg</td></tr>\n";
639
+            $fautifs[] = [$ligne, $col, $i, $msg];
640
+        }
641
+        $err = "<h2 style='text-align: center'>"
642
+            . $i
643
+            . "<a href='#fin_err'>"
644
+            . ' ' . _T('erreur_texte')
645
+            . "</a></h2><table id='debut_err' style='width: 100%'>"
646
+            . $err
647
+            . " </table><a id='fin_err'></a>";
648
+
649
+        return [ancre_texte($texte, $fautifs), $err];
650
+    } else {
651
+        list($msg, $fermant, $ouvrant) = $errs[0];
652
+        $rf = reference_boucle_debug($fermant, $fonc, $self);
653
+        $ro = reference_boucle_debug($ouvrant, $fonc, $self);
654
+        $err = $msg .
655
+            "<a href='#L" . $fermant . "'>$fermant</a>$rf<br />" .
656
+            "<a href='#L" . $ouvrant . "'>$ouvrant</a>$ro";
657
+
658
+        return [ancre_texte($texte, [[$ouvrant], [$fermant]]), $err];
659
+    }
660 660
 }
661 661
 
662 662
 // https://code.spip.net/@count_occ
663 663
 function count_occ($regs) {
664
-	$encore = [];
665
-	foreach ($regs as $r) {
666
-		if (isset($encore[$r[0]])) {
667
-			$encore[$r[0]]++;
668
-		} else {
669
-			$encore[$r[0]] = 1;
670
-		}
671
-	}
672
-
673
-	return $encore;
664
+    $encore = [];
665
+    foreach ($regs as $r) {
666
+        if (isset($encore[$r[0]])) {
667
+            $encore[$r[0]]++;
668
+        } else {
669
+            $encore[$r[0]] = 1;
670
+        }
671
+    }
672
+
673
+    return $encore;
674 674
 }
675 675
 
676 676
 function debusquer_navigation_squelettes($self) {
677 677
 
678
-	$res = '';
679
-	$boucles = !empty($GLOBALS['debug_objets']['boucle']) ? $GLOBALS['debug_objets']['boucle'] : '';
680
-	$contexte = $GLOBALS['debug_objets']['contexte'];
681
-	$t_skel = _T('squelette');
682
-	foreach ($GLOBALS['debug_objets']['sourcefile'] as $nom => $sourcefile) {
683
-		$self2 = parametre_url($self, 'var_mode_objet', $nom);
684
-		$nav = !$boucles ? '' : debusquer_navigation_boucles($boucles, $nom, $self, $sourcefile);
685
-		$temps = !isset($GLOBALS['debug_objets']['profile'][$sourcefile]) ? '' : _T(
686
-			'zbug_profile',
687
-			['time' => $GLOBALS['debug_objets']['profile'][$sourcefile]]
688
-		);
689
-
690
-		$res .= "<fieldset id='f_" . $nom . "'><legend>"
691
-			. $t_skel
692
-			. ' '
693
-			. $sourcefile
694
-			. "&nbsp;:\n<a href='$self2&amp;var_mode_affiche=squelette#f_$nom'>"
695
-			. $t_skel
696
-			. "</a>\n<a href='$self2&amp;var_mode_affiche=resultat#f_$nom'>"
697
-			. _T('zbug_resultat')
698
-			. "</a>\n<a href='$self2&amp;var_mode_affiche=code#f_$nom'>"
699
-			. _T('zbug_code')
700
-			. "</a>\n<a href='"
701
-			. str_replace('var_mode=debug', 'var_profile=1&amp;var_mode=recalcul', $self)
702
-			. "'>"
703
-			. _T('zbug_calcul')
704
-			. '</a></legend>'
705
-			. (!$temps ? '' : ("\n<span style='display:block;float:" . $GLOBALS['spip_lang_right'] . "'>$temps</span><br />"))
706
-			. debusquer_contexte($contexte[$sourcefile])
707
-		. (!$nav ? '' : ("<table width='100%'>\n$nav</table>\n"))
708
-		. "</fieldset>\n";
709
-	}
710
-
711
-	return $res;
678
+    $res = '';
679
+    $boucles = !empty($GLOBALS['debug_objets']['boucle']) ? $GLOBALS['debug_objets']['boucle'] : '';
680
+    $contexte = $GLOBALS['debug_objets']['contexte'];
681
+    $t_skel = _T('squelette');
682
+    foreach ($GLOBALS['debug_objets']['sourcefile'] as $nom => $sourcefile) {
683
+        $self2 = parametre_url($self, 'var_mode_objet', $nom);
684
+        $nav = !$boucles ? '' : debusquer_navigation_boucles($boucles, $nom, $self, $sourcefile);
685
+        $temps = !isset($GLOBALS['debug_objets']['profile'][$sourcefile]) ? '' : _T(
686
+            'zbug_profile',
687
+            ['time' => $GLOBALS['debug_objets']['profile'][$sourcefile]]
688
+        );
689
+
690
+        $res .= "<fieldset id='f_" . $nom . "'><legend>"
691
+            . $t_skel
692
+            . ' '
693
+            . $sourcefile
694
+            . "&nbsp;:\n<a href='$self2&amp;var_mode_affiche=squelette#f_$nom'>"
695
+            . $t_skel
696
+            . "</a>\n<a href='$self2&amp;var_mode_affiche=resultat#f_$nom'>"
697
+            . _T('zbug_resultat')
698
+            . "</a>\n<a href='$self2&amp;var_mode_affiche=code#f_$nom'>"
699
+            . _T('zbug_code')
700
+            . "</a>\n<a href='"
701
+            . str_replace('var_mode=debug', 'var_profile=1&amp;var_mode=recalcul', $self)
702
+            . "'>"
703
+            . _T('zbug_calcul')
704
+            . '</a></legend>'
705
+            . (!$temps ? '' : ("\n<span style='display:block;float:" . $GLOBALS['spip_lang_right'] . "'>$temps</span><br />"))
706
+            . debusquer_contexte($contexte[$sourcefile])
707
+        . (!$nav ? '' : ("<table width='100%'>\n$nav</table>\n"))
708
+        . "</fieldset>\n";
709
+    }
710
+
711
+    return $res;
712 712
 }
713 713
 
714 714
 function debusquer_navigation_boucles($boucles, $nom_skel, $self, $nom_source) {
715
-	$i = 0;
716
-	$res = '';
717
-	$var_mode_objet = _request('var_mode_objet');
718
-	$gram = preg_match('/[.](\w+)$/', $nom_source, $r) ? $r[1] : '';
719
-
720
-	foreach ($boucles as $objet => $boucle) {
721
-		if (substr($objet, 0, strlen($nom_skel)) == $nom_skel) {
722
-			$i++;
723
-			$nom = $boucle->id_boucle;
724
-			$req = $boucle->type_requete;
725
-			$crit = public_decompiler($boucle, $gram, 0, 'criteres');
726
-			$self2 = $self . '&amp;var_mode_objet=' . $objet;
727
-
728
-			$res .= "\n<tr style='background-color: " .
729
-				($i % 2 ? '#e0e0f0' : '#f8f8ff') .
730
-				"'><td  align='right'>$i</td><td>\n" .
731
-				"<a  class='debug_link_boucle' href='" .
732
-				$self2 .
733
-				"&amp;var_mode_affiche=boucle#f_$nom_skel'>" .
734
-				_T('zbug_boucle') .
735
-				"</a></td><td>\n<a class='debug_link_boucle' href='" .
736
-				$self2 .
737
-				"&amp;var_mode_affiche=resultat#f_$nom_skel'>" .
738
-				_T('zbug_resultat') .
739
-				"</a></td><td>\n<a class='debug_link_resultat' href='" .
740
-				$self2 .
741
-				"&amp;var_mode_affiche=code#f_$nom_skel'>" .
742
-				_T('zbug_code') .
743
-				"</a></td><td>\n<a class='debug_link_resultat' href='" .
744
-				str_replace('var_mode=', 'var_profile=', $self2) .
745
-				"'>" .
746
-				_T('zbug_calcul') .
747
-				"</a></td><td>\n" .
748
-				(($var_mode_objet == $objet) ? "<b>$nom</b>" : $nom) .
749
-				"</td><td>\n" .
750
-				$req .
751
-				"</td><td>\n" .
752
-				spip_htmlspecialchars($crit) .
753
-				'</td></tr>';
754
-		}
755
-	}
756
-
757
-	return $res;
715
+    $i = 0;
716
+    $res = '';
717
+    $var_mode_objet = _request('var_mode_objet');
718
+    $gram = preg_match('/[.](\w+)$/', $nom_source, $r) ? $r[1] : '';
719
+
720
+    foreach ($boucles as $objet => $boucle) {
721
+        if (substr($objet, 0, strlen($nom_skel)) == $nom_skel) {
722
+            $i++;
723
+            $nom = $boucle->id_boucle;
724
+            $req = $boucle->type_requete;
725
+            $crit = public_decompiler($boucle, $gram, 0, 'criteres');
726
+            $self2 = $self . '&amp;var_mode_objet=' . $objet;
727
+
728
+            $res .= "\n<tr style='background-color: " .
729
+                ($i % 2 ? '#e0e0f0' : '#f8f8ff') .
730
+                "'><td  align='right'>$i</td><td>\n" .
731
+                "<a  class='debug_link_boucle' href='" .
732
+                $self2 .
733
+                "&amp;var_mode_affiche=boucle#f_$nom_skel'>" .
734
+                _T('zbug_boucle') .
735
+                "</a></td><td>\n<a class='debug_link_boucle' href='" .
736
+                $self2 .
737
+                "&amp;var_mode_affiche=resultat#f_$nom_skel'>" .
738
+                _T('zbug_resultat') .
739
+                "</a></td><td>\n<a class='debug_link_resultat' href='" .
740
+                $self2 .
741
+                "&amp;var_mode_affiche=code#f_$nom_skel'>" .
742
+                _T('zbug_code') .
743
+                "</a></td><td>\n<a class='debug_link_resultat' href='" .
744
+                str_replace('var_mode=', 'var_profile=', $self2) .
745
+                "'>" .
746
+                _T('zbug_calcul') .
747
+                "</a></td><td>\n" .
748
+                (($var_mode_objet == $objet) ? "<b>$nom</b>" : $nom) .
749
+                "</td><td>\n" .
750
+                $req .
751
+                "</td><td>\n" .
752
+                spip_htmlspecialchars($crit) .
753
+                '</td></tr>';
754
+        }
755
+    }
756
+
757
+    return $res;
758 758
 }
759 759
 
760 760
 function debusquer_source($objet, $affiche) {
761
-	$quoi = $GLOBALS['debug_objets'][$affiche][$objet];
762
-	if (!empty($GLOBALS['debug_objets']['boucle'][$objet]->id_boucle)) {
763
-		$nom = $GLOBALS['debug_objets']['boucle'][$objet]->id_boucle;
764
-	} else {
765
-		$nom = $GLOBALS['debug_objets']['sourcefile'][$objet];
766
-	}
767
-	$res2 = '';
768
-
769
-	if ($affiche == 'resultat') {
770
-		$legend = $nom;
771
-		$req = $GLOBALS['debug_objets']['requete'][$objet];
772
-		if (function_exists('_mysql_traite_query')) {
773
-			$c = strtolower(_request('connect'));
774
-			$c = $GLOBALS['connexions'][$c ? $c : 0]['prefixe'];
775
-			$req = _mysql_traite_query($req, '', $c);
776
-		}
777
-		//  permettre le copier/coller facile
778
-		// $res = ancre_texte($req, array(), true);
779
-		$res = "<div id='T" . md5($req) . "'>\n<pre>\n" . $req . "</pre>\n</div>\n";
780
-		//  formatage et affichage des resultats bruts de la requete
781
-		$ress_req = spip_query($req);
782
-		$brut_sql = '';
783
-		$num = 1;
784
-		//  eviter l'affichage de milliers de lignes
785
-		//  personnalisation possible dans mes_options
786
-		$max_aff = defined('_MAX_DEBUG_AFF') ? _MAX_DEBUG_AFF : 50;
787
-		while ($retours_sql = sql_fetch($ress_req)) {
788
-			if ($num <= $max_aff) {
789
-				$brut_sql .= '<h3>' . ($num == 1 ? $num . ' sur ' . sql_count($ress_req) : $num) . '</h3>';
790
-				$brut_sql .= '<p>';
791
-				foreach ($retours_sql as $key => $val) {
792
-					$brut_sql .= '<strong>' . $key . '</strong> => ' . spip_htmlspecialchars(couper($val, 150)) . "<br />\n";
793
-				}
794
-				$brut_sql .= '</p>';
795
-			}
796
-			$num++;
797
-		}
798
-		$res2 = interdire_scripts($brut_sql);
799
-		foreach ($quoi as $view) {
800
-			//  ne pas afficher les $contexte_inclus
801
-			$view = preg_replace(',<\?php.+\?[>],Uims', '', $view);
802
-			if ($view) {
803
-				$res2 .= "\n<br /><fieldset>" . interdire_scripts($view) . '</fieldset>';
804
-			}
805
-		}
806
-	} elseif ($affiche == 'code') {
807
-		$legend = $nom;
808
-		$res = ancre_texte('<' . "?php\n" . $quoi . "\n?" . '>');
809
-	} elseif ($affiche == 'boucle') {
810
-		$legend = _T('zbug_boucle') . ' ' . $nom;
811
-		// Le compilateur prefixe le nom des boucles par l'extension du fichier source.
812
-		$gram = preg_match('/^([^_]+)_/', $objet, $r) ? $r[1] : '';
813
-		$res = ancre_texte(public_decompiler($quoi, $gram, 0, 'boucle'));
814
-	} elseif ($affiche == 'squelette') {
815
-		$legend = $GLOBALS['debug_objets']['sourcefile'][$objet];
816
-		$res = ancre_texte($GLOBALS['debug_objets']['squelette'][$objet]);
817
-	}
818
-
819
-	return [$legend, $res, $res2];
761
+    $quoi = $GLOBALS['debug_objets'][$affiche][$objet];
762
+    if (!empty($GLOBALS['debug_objets']['boucle'][$objet]->id_boucle)) {
763
+        $nom = $GLOBALS['debug_objets']['boucle'][$objet]->id_boucle;
764
+    } else {
765
+        $nom = $GLOBALS['debug_objets']['sourcefile'][$objet];
766
+    }
767
+    $res2 = '';
768
+
769
+    if ($affiche == 'resultat') {
770
+        $legend = $nom;
771
+        $req = $GLOBALS['debug_objets']['requete'][$objet];
772
+        if (function_exists('_mysql_traite_query')) {
773
+            $c = strtolower(_request('connect'));
774
+            $c = $GLOBALS['connexions'][$c ? $c : 0]['prefixe'];
775
+            $req = _mysql_traite_query($req, '', $c);
776
+        }
777
+        //  permettre le copier/coller facile
778
+        // $res = ancre_texte($req, array(), true);
779
+        $res = "<div id='T" . md5($req) . "'>\n<pre>\n" . $req . "</pre>\n</div>\n";
780
+        //  formatage et affichage des resultats bruts de la requete
781
+        $ress_req = spip_query($req);
782
+        $brut_sql = '';
783
+        $num = 1;
784
+        //  eviter l'affichage de milliers de lignes
785
+        //  personnalisation possible dans mes_options
786
+        $max_aff = defined('_MAX_DEBUG_AFF') ? _MAX_DEBUG_AFF : 50;
787
+        while ($retours_sql = sql_fetch($ress_req)) {
788
+            if ($num <= $max_aff) {
789
+                $brut_sql .= '<h3>' . ($num == 1 ? $num . ' sur ' . sql_count($ress_req) : $num) . '</h3>';
790
+                $brut_sql .= '<p>';
791
+                foreach ($retours_sql as $key => $val) {
792
+                    $brut_sql .= '<strong>' . $key . '</strong> => ' . spip_htmlspecialchars(couper($val, 150)) . "<br />\n";
793
+                }
794
+                $brut_sql .= '</p>';
795
+            }
796
+            $num++;
797
+        }
798
+        $res2 = interdire_scripts($brut_sql);
799
+        foreach ($quoi as $view) {
800
+            //  ne pas afficher les $contexte_inclus
801
+            $view = preg_replace(',<\?php.+\?[>],Uims', '', $view);
802
+            if ($view) {
803
+                $res2 .= "\n<br /><fieldset>" . interdire_scripts($view) . '</fieldset>';
804
+            }
805
+        }
806
+    } elseif ($affiche == 'code') {
807
+        $legend = $nom;
808
+        $res = ancre_texte('<' . "?php\n" . $quoi . "\n?" . '>');
809
+    } elseif ($affiche == 'boucle') {
810
+        $legend = _T('zbug_boucle') . ' ' . $nom;
811
+        // Le compilateur prefixe le nom des boucles par l'extension du fichier source.
812
+        $gram = preg_match('/^([^_]+)_/', $objet, $r) ? $r[1] : '';
813
+        $res = ancre_texte(public_decompiler($quoi, $gram, 0, 'boucle'));
814
+    } elseif ($affiche == 'squelette') {
815
+        $legend = $GLOBALS['debug_objets']['sourcefile'][$objet];
816
+        $res = ancre_texte($GLOBALS['debug_objets']['squelette'][$objet]);
817
+    }
818
+
819
+    return [$legend, $res, $res2];
820 820
 }
821 821
 
822 822
 // https://code.spip.net/@debusquer_entete
823 823
 function debusquer_entete($titre, $corps) {
824 824
 
825
-	include_spip('balise/formulaire_admin');
826
-	include_spip('public/assembler'); // pour inclure_balise_dynamique
827
-	include_spip('inc/texte'); // pour corriger_typo
828
-
829
-	return _DOCTYPE_ECRIRE .
830
-	html_lang_attributes() .
831
-	"<head>\n<title>" .
832
-	('SPIP ' . $GLOBALS['spip_version_affichee'] . ' ' .
833
-		_T('admin_debug') . ' ' . $titre . ' (' .
834
-		supprimer_tags(corriger_typo($GLOBALS['meta']['nom_site']))) .
835
-	")</title>\n" .
836
-	"<meta http-equiv='Content-Type' content='text/html" .
837
-	(($c = $GLOBALS['meta']['charset']) ? "; charset=$c" : '') .
838
-	"' />\n" .
839
-	http_script('', 'jquery.js')
840
-	. "<link rel='stylesheet' href='" . url_absolue(find_in_path('spip_admin.css'))
841
-	. "' type='text/css' />" .
842
-	"</head>\n" .
843
-	"<body style='margin:0 10px;'>\n" .
844
-	"<div id='spip-debug-header'>" .
845
-	$corps .
846
-	inclure_balise_dynamique(balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $GLOBALS['debug_objets']), false) .
847
-	'</div></body></html>';
825
+    include_spip('balise/formulaire_admin');
826
+    include_spip('public/assembler'); // pour inclure_balise_dynamique
827
+    include_spip('inc/texte'); // pour corriger_typo
828
+
829
+    return _DOCTYPE_ECRIRE .
830
+    html_lang_attributes() .
831
+    "<head>\n<title>" .
832
+    ('SPIP ' . $GLOBALS['spip_version_affichee'] . ' ' .
833
+        _T('admin_debug') . ' ' . $titre . ' (' .
834
+        supprimer_tags(corriger_typo($GLOBALS['meta']['nom_site']))) .
835
+    ")</title>\n" .
836
+    "<meta http-equiv='Content-Type' content='text/html" .
837
+    (($c = $GLOBALS['meta']['charset']) ? "; charset=$c" : '') .
838
+    "' />\n" .
839
+    http_script('', 'jquery.js')
840
+    . "<link rel='stylesheet' href='" . url_absolue(find_in_path('spip_admin.css'))
841
+    . "' type='text/css' />" .
842
+    "</head>\n" .
843
+    "<body style='margin:0 10px;'>\n" .
844
+    "<div id='spip-debug-header'>" .
845
+    $corps .
846
+    inclure_balise_dynamique(balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $GLOBALS['debug_objets']), false) .
847
+    '</div></body></html>';
848 848
 }
Please login to merge, or discard this patch.