Subversion Repositories Sites.tela-botanica.org

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4 david 1
<?php
2
 
3
/***************************************************************************\
4
 *  SPIP, Systeme de publication pour l'internet                           *
5
 *                                                                         *
6
 *  Copyright (c) 2001-2005                                                *
7
 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8
 *                                                                         *
9
 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10
 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11
\***************************************************************************/
12
 
13
 
14
//
15
// Ce fichier ne sera execute qu'une fois
16
if (defined("_INC_DEBUG_SQL")) return;
17
define("_INC_DEBUG_SQL", "1");
18
 
19
function afficher_debug_contexte($env) {
20
	static $n;
21
	$n++;
22
 
23
	if (is_array($env_tab = @unserialize($env)))
24
		$env = $env_tab;
25
 
26
	$env_texte="";
27
	if (count($env)>0) {
28
		$env_texte="<div class='spip-env'>"
29
			. "<fieldset><legend>#ENV</legend>\n"
30
			. "<div><table>\n";
31
		foreach ($env as $nom => $valeur) {
32
			$env_texte .= "\n<tr><td><strong>".nl2br(entites_html($nom))
33
				. "</strong></td>";
34
			$env_texte .= "<td>:&nbsp;".nl2br(entites_html($valeur))
35
				. "</td></tr>\n";
36
		}
37
		$env_texte .= "\n</table></div>\n";
38
		$env_texte .= "</fieldset></div>\n";
39
	}
40
	return $env_texte;
41
}
42
 
43
// Si le code php produit des erreurs, on les affiche en surimpression
44
// sauf pour un visiteur non admin (lui ne voit rien de special)
45
// ajouter &var_mode=debug pour voir les erreurs et en parler sur spip@rezo.net
46
function affiche_erreurs_page($tableau_des_erreurs) {
47
 
48
	$GLOBALS['bouton_admin_debug'] = true;
49
	$res = '';
50
	foreach ($tableau_des_erreurs as $err) {
51
		$res .= "<li>" .$err[0] . ", <small>".$err[1]."</small><br /></li>\n";
52
	}
53
	return "\n<div id='spip-debug' style='"
54
	. "position: absolute; top: 20px; left: 20px; z-index: 1000;"
55
	. "filter:alpha(opacity=60); -moz-opacity:0.6; opacity: 0.6;"
56
	. "'><ul><li>"
57
	. _T('zbug_erreur_squelette')
58
## aide locale courte a ecrire, avec lien vers une grosse page de documentation
59
#		aide('erreur_compilation'),
60
	. "<br /></li>"
61
	. "<ul>"
62
	. $res
63
	. "</ul></ul></div>";
64
}
65
 
66
//
67
// Si une boucle cree des soucis, on peut afficher la requete fautive
68
// avec son code d'erreur
69
//
70
function erreur_requete_boucle($query, $id_boucle, $type, $errno, $erreur) {
71
 
72
	$GLOBALS['bouton_admin_debug'] = true;
73
 
74
	if (eregi('err(no|code):?[[:space:]]*([0-9]+)', $erreur, $regs))
75
		$errno = $regs[2];
76
	else if (($errno == 1030 OR $errno <= 1026)
77
		AND ereg('[^[:alnum:]]([0-9]+)[^[:alnum:]]', $erreur, $regs))
78
	$errno = $regs[1];
79
 
80
	// Erreur systeme
81
	if ($errno > 0 AND $errno < 200) {
82
		$retour .= "<tt><br /><br /><blink>"
83
		. _T('info_erreur_systeme', array('errsys'=>$errno))
84
		. "</blink><br />\n"
85
		. _T('info_erreur_systeme2');
86
		spip_log("Erreur systeme $errno");
87
	}
88
	// Requete erronee
89
	else {
90
		$retour .= "<tt><blink>&lt;BOUCLE".$id_boucle."&gt;("
91
		. $type . ")</blink><br />\n"
92
		. "<b>"._T('avis_erreur_mysql')."</b><br />\n"
93
		. htmlspecialchars($query)
94
		. "\n<br /><font color='red'><b>".htmlspecialchars($erreur)
95
		. "</b></font><br />"
96
		. "<blink>&lt;/BOUCLE".$id_boucle."&gt;</blink></tt>\n";
97
 
98
		include_ecrire('inc_presentation.php3');
99
		include_ecrire('inc_lang.php3');
100
		utiliser_langue_visiteur();
101
		$retour .= aide('erreur_mysql');
102
		spip_log("Erreur requete $id_boucle (".$GLOBALS['fond'].".html)");
103
	}
104
 
105
	erreur_squelette($retour);
106
}
107
 
108
 
109
//
110
// Erreur de syntaxe des squelettes : memoriser le code fautif
111
//
112
function erreur_squelette($message='', $lieu='') {
113
	global $tableau_des_erreurs;
114
	global $auteur_session;
115
	static $runs;
116
 
117
	if (is_array($message)) list($message, $lieu) = $message;
118
 
119
	spip_log("Erreur squelette: $message | $lieu ("
120
		. $GLOBALS['fond'].".html)");
121
	$GLOBALS['bouton_admin_debug'] = true;
122
	$tableau_des_erreurs[] = array($message, $lieu);
123
	// Eviter les boucles infernales
124
	if (++$runs > 4) {
125
		if ($_COOKIE['spip_admin'] OR
126
		$auteur_session['statut'] == '0minirezo' OR
127
		    ($GLOBALS['var_mode'] == 'debug')) {
128
			echo debut_entete(_T('admin_debug')), '</head><body>',
129
				affiche_erreurs_page($tableau_des_erreurs);
130
			exit;
131
		}
132
	}
133
}
134
 
135
//
136
// Le debusqueur version 3
137
//
138
 
139
// appelee a chaque sortie de boucle (inc-compilo) et a chaque requete
140
// dans ce derniers cas on n'a pas le nom du squelette
141
 
142
function boucle_debug_resultat ($id, $type, $resultat) {
143
	global $debug_objets;
144
 
145
	$nom = $debug_objets['courant'];
146
 
147
	if ($type == 'requete') {
148
	  $debug_objets['requete']["$nom$id"] = $resultat;
149
	}
150
	else {
151
	  // ne pas memoriser plus de 3 tours d'une meme boucle
152
	  if (count($debug_objets['resultat']["$nom$id"]) < 3)
153
	    $debug_objets['resultat']["$nom$id"][] = $resultat;
154
	}
155
}
156
 
157
// appelee a chaque sortie de sequence (inc-compilo)
158
function debug_sequence($id, $nom, $niv, $sequence) {
159
	global $debug_objets;
160
 
161
	if (!$niv)
162
	  {
163
	    $debug_objets['sequence'][$nom.$id] = $sequence;
164
	  }
165
	$res = "";
166
	foreach($sequence as $v) $res .= $v[2];
167
	return $res;
168
}
169
 
170
// appelee a chaque compilation de boucle (inc-compilo)
171
function boucle_debug_compile ($id, $nom, $code) {
172
	global $debug_objets;
173
 
174
	$debug_objets['code'][$nom.$id] = $code;
175
}
176
 
177
// appelee a chaque compilation de squelette (inc-compilo)
178
function squelette_debug_compile($nom, $sourcefile, $code, $squelette) {
179
	global $debug_objets;
180
 
181
	$debug_objets['squelette'][$nom] = $squelette;
182
	$debug_objets['sourcefile'][$nom] = $sourcefile;
183
 
184
	if (is_array($GLOBALS['contexte_inclus']))
185
		$debug_objets['contexte'][$nom] = $GLOBALS['contexte_inclus'];
186
	else {
187
		$debug_objets['contexte'][$nom] = $GLOBALS['contexte'];
188
		if (!isset($debug_objets['principal']))
189
		  $debug_objets['principal'] = $nom;
190
	}
191
}
192
 
193
// appelee a chaque analyse syntaxique de squelette
194
function boucle_debug ($nom, $id_parent, $id, $type, $crit, $avant, $milieu, $apres, $altern) {
195
	global $debug_objets;
196
	$debug_objets['courant'] = $nom;
197
	$debug_objets['parent'][$nom.$id] = $id_parent;
198
	$debug_objets['pretty'][$nom.$id] =
199
		"BOUCLE$id($type)" . htmlspecialchars(
200
			preg_replace(",[\r\n],", "\\n", $crit));
201
	// on synthetise avec la syntaxe standard, mais "<//" pose pb
202
	$debug_objets['boucle'][$nom.$id] =
203
	  (!$avant ? "" : "<B$id>$avant") .
204
	  "<BOUCLE$id($type)$crit>" .
205
	  $milieu .
206
	  "</BOUCLE$id>" .
207
	  (!$apres ? "" : "$apres</B$id>") .
208
	  (!$altern ? "" : "$altern<//B$id>");
209
}
210
 
211
function trouve_boucle_debug($n, $nom, $debut=0, $boucle = "")
212
{
213
	global $debug_objets;
214
 
215
	$id = $nom . $boucle;
216
	foreach($debug_objets['sequence'][$id] as $v) {
217
	  if (!ereg('^(.*)(<\?.*\?>)(.*)$', $v[2],$r))
218
	    $y = substr_count($v[2], "\n");
219
	  else {
220
	    if ($v[1][0] == '#')
221
	      // balise dynamique
222
	      $incl = $debug_objets['resultat'][$v[0]];
223
	    else
224
	      // inclusion
225
	      $incl = $debug_objets['squelette'][trouve_squelette_inclus($v[1])];
226
	    $y = substr_count($incl, "\n")
227
	      + substr_count($r[1], "\n")
228
	      + substr_count($r[3], "\n");
229
	  }
230
 
231
	  if ($n <= ($y + $debut)) {
232
	    if ($v[1][0] == '?')
233
	      return trouve_boucle_debug($n, $nom, $debut, substr($v[1],1));
234
	    elseif ($v[1][0] == '!') {
235
	      if ($incl = trouve_squelette_inclus($v[1]))
236
		return trouve_boucle_debug($n, $incl, $debut);
237
	    }
238
	    return array($nom, $boucle, $v[0]);
239
	  }
240
	  $debut += $y;
241
	}
242
	return array($nom, $boucle, $n-$debut);
243
}
244
 
245
function trouve_squelette_inclus($script)
246
{
247
  global $debug_objets;
248
  // on suppose que X.php appelle le squelette X.html (a revoir)
249
  ereg('^.(.*).php?3', $script, $reg);
250
  $incl = $reg[1] . '.html$';
251
  foreach($debug_objets['sourcefile'] as $k => $v) {
252
    if (ereg($incl,$v)) return $k;
253
  }
254
  return "";
255
}
256
 
257
function reference_boucle_debug($n, $nom, $self)
258
{
259
  list($skel, $boucle, $ligne) = trouve_boucle_debug($n, $nom);
260
 
261
  if (!$boucle)
262
    return !$ligne ? "" :
263
      (" (" .
264
       (($nom != $skel) ? _L("squelette inclus, ligne: ") :
265
	_L("squelette, ligne: ")) .
266
       "<a href='$self&amp;var_mode_objet=$skel&amp;var_mode_affiche=squelette&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)");
267
  else {
268
  $self .= "&amp;var_mode_objet=$skel$boucle&amp;var_mode_affiche=boucle";
269
 
270
    return !$ligne ? " (boucle <a href='$self#$skel$boucle'>$boucle</a>)" :
271
      " (boucle $boucle ligne <a href='$self&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)";
272
  }
273
}
274
 
275
// affiche un texte avec numero de ligne et ancre.
276
 
277
function ancre_texte($texte, $fautifs=array())
278
{
279
	global $var_mode_ligne;
280
	if ($var_mode_ligne) $fautifs[]=$var_mode_ligne;
281
	ob_start();
282
	highlight_string($texte);
283
	$s = ob_get_contents();
284
	ob_end_clean();
285
	if (substr($s,0,6) == '<code>') { $s=substr($s,6); echo '<code>';}
286
	$tableau = explode("<br />", $s);
287
	$format = "<span style='color: black'>%0".
288
	  strlen(count($tableau)).
289
	  "d </span>";
290
	$format10=str_replace('black','pink',$format);
291
	$formaterr="<span style='background-color: pink'>%s</span>";
292
	$i=1;
293
 
294
	foreach ($tableau as $ligne) {
295
		echo "<br />\n<a id='L$i' href='#debug_boucle'>",
296
		  sprintf((($i%10) ? $format :$format10), $i),
297
		  "</a>",
298
		  sprintf(in_array($i, $fautifs) ? $formaterr : '%s',
299
			  $ligne) ;
300
		$i++;
301
	}
302
}
303
 
304
// l'environnement graphique du debuggueur
305
function debug_dumpfile ($texte, $fonc, $type) {
306
 
307
	global $debug_objets, $var_mode_objet, $var_mode_affiche;
308
 
309
	$debug_objets[$type][$fonc . 'tout'] = $texte;
310
	if (!$debug_objets['sourcefile']) return;
311
	if ($texte && ($var_mode_objet != $fonc || $var_mode_affiche != $type))
312
		return;
313
	if (!$fonc) $fonc = $debug_objets['principal'];
314
	$link = new Link;
315
	$link->delvar('var_mode_affiche');
316
	$link->delvar('var_mode_objet');
317
	$link->addvar('var_mode','debug');
318
	$self = quote_amp($link->getUrl());
319
 
320
// en cas de squelette inclus,  virer le code de l'incluant:
321
// - il contient souvent une Div restreignant la largeur a 3 fois rien
322
// - ca fait 2 headers !
323
	ob_end_clean();
324
 
325
	@header('Content-Type: text/html; charset='.lire_meta('charset'));
326
	echo debut_entete('Spip ' . $GLOBALS['spip_version_affichee'] . ' ' .
327
			  _T('admin_debug') . ' ' .
328
			  supprimer_tags(extraire_multi(lire_meta('nom_site')))),
329
	  "<link rel='stylesheet' href='spip_admin.css' type='text/css'>",
330
	  "</head>\n<body style='margin:0 10px;'>",
331
	  "\n<div id='spip-debug' style='position: absolute; top: 22px; z-index: 1000;height:97%;left:10px;right:10px;'><div id='spip-boucles'>\n";
332
 
333
	if ($var_mode_affiche !== 'validation') {
334
	  foreach ($debug_objets['sourcefile'] as $nom_skel => $sourcefile) {
335
		echo "<fieldset><legend>",$sourcefile,"&nbsp;: ";
336
		echo "\n<a href='",$self, "&amp;var_mode_objet=$nom_skel&amp;var_mode_affiche=squelette#$nom_skel'>"._T('squelette')."</a>";
337
		echo "\n<a href='",$self, "&amp;var_mode_objet=$nom_skel&amp;var_mode_affiche=resultat#$nom_skel'>"._T('zbug_resultat')."</a>";
338
		echo "\n<a href='", $self, "&amp;var_mode_objet=$nom_skel&amp;var_mode_affiche=code#$nom_skel'>"._T('zbug_code')."</a></legend>";
339
 
340
		if (is_array($contexte = $debug_objets['contexte'][$nom_skel]))
341
			echo afficher_debug_contexte($contexte);
342
 
343
		$i = 0;
344
		$colors = array('#e0e0f0', '#f8f8ff');
345
		$res = "";
346
		foreach ($debug_objets['pretty'] as $nom => $pretty)
347
			if (substr($nom, 0, strlen($nom_skel)) == $nom_skel) {
348
				$i++;
349
				$aff = "&lt;".$pretty."&gt;";
350
				if ($var_mode_objet == $nom)
351
					$aff = "<b>$aff</b>";
352
				$res .= "\n<tr bgcolor='" .
353
				  $colors[$i%2] .
354
				  "'><td  align='right'>$i</td><td>" .
355
				  "<a  class='debug_link_boucle' href='" .
356
				  $self .
357
				  "&amp;var_mode_objet=" .
358
				  $nom .
359
				  "&amp;var_mode_affiche=boucle#$nom_skel'>" .
360
				  _T('zbug_boucle') .
361
				  "</a></td><td><a class='debug_link_boucle' href='" .
362
				  $self .
363
				  "&amp;var_mode_objet=" .
364
				  $nom .
365
				  "&amp;var_mode_affiche=resultat#$nom_skel'>" .
366
				  _T('zbug_resultat') .
367
				  "</a></td><td><a class='debug_link_resultat' href='" .
368
				  $self .
369
				  "&amp;var_mode_objet=" .
370
				  $nom .
371
				  "&amp;var_mode_affiche=code#$nom_skel'>" .
372
				  _T('zbug_code') .
373
				  "</a></td><td>" .
374
				  $aff .
375
				  "</td></tr>";
376
			}
377
		if ($res) echo "<table width='100%'>\n$res</table>\n";
378
		echo "</fieldset>\n";
379
	  }
380
	  echo "</div>\n<a id='$fonc'></a>\n";
381
	  if ($var_mode_objet && ($res = $debug_objets[$var_mode_affiche][$var_mode_objet])) {
382
	    echo "<div id=\"debug_boucle\"><fieldset>";
383
	    if ($var_mode_affiche == 'resultat') {
384
		echo "<legend>",$debug_objets['pretty'][$var_mode_objet],"</legend>";
385
		ancre_texte($debug_objets['requete'][$var_mode_objet]);
386
		foreach ($res as $view)
387
			if ($view) echo "\n<br /><fieldset>",interdire_scripts($view),"</fieldset>";
388
 
389
	    } else if ($var_mode_affiche == 'code') {
390
		echo  "<legend>",$debug_objets['pretty'][$var_mode_objet],"</legend>";
391
		ancre_texte("<"."?php\n".$res."\n?".">");
392
	    } else if ($var_mode_affiche == 'boucle') {
393
		echo  "<legend>",$debug_objets['pretty'][$var_mode_objet],"</legend>";
394
		ancre_texte($res);
395
	    } else if ($var_mode_affiche == 'squelette') {
396
		echo  "<legend>",$debug_objets['sourcefile'][$var_mode_objet],"</legend>";
397
		ancre_texte($debug_objets['squelette'][$var_mode_objet]);
398
	    }
399
	    echo "</fieldset></div>";
400
	  }
401
	}
402
	if ($texte) {
403
 
404
	  $ouvrant = $fermant = $err = "";
405
	  $titre = $GLOBALS['var_mode_affiche'];
406
	  if ($titre != 'validation') {
407
	    $titre = 'zbug_' . $titre;
408
	  }
409
	  else {
410
	      include_ecrire("inc_spip_sax.php");
411
	      $res = spip_sax($texte);
412
	      if (!$res)
413
		$err = _L("impossible");
414
	      elseif (ereg("^[[:space:]]*([^<][^0-9]*)([0-9]*)(.*[^0-9])([0-9]*)$", $GLOBALS['xhtml_error'], $r)) {
415
		$fermant = $r[2];
416
		$ouvrant = $r[4];
417
		$rf = reference_boucle_debug($fermant, $fonc, $self);
418
		$ro = reference_boucle_debug($ouvrant, $fonc, $self);
419
		$err = ": " . $r[1] .
420
		  "<a href='#L" . $r[2] . "'>$r[2]</a>$rf" .
421
		  $r[3] ."<a href='#L" . $r[4] . "'>$r[4]</a>$ro";
422
	      } else {
423
		  $err = _L("correcte");
424
		  $texte = $res;
425
	      }
426
	  }
427
	  echo "<div id=\"debug_boucle\"><fieldset><legend>",
428
	    _T($titre),
429
	    ' ',
430
	    $err,
431
	    "</legend>";
432
	  ancre_texte($texte, array($ouvrant, $fermant));
433
	  echo "</fieldset></div>";
434
	}
435
	echo "\n</div>";
436
	echo inclure_balise_dynamique(
437
		balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $debug_objets)
438
	);
439
	echo '</body></html>';
440
	exit;
441
}
442
?>