\n";
}
return $env_texte;
}
// Si le code php produit des erreurs, on les affiche en surimpression
// sauf pour un visiteur non admin (lui ne voit rien de special)
// ajouter &var_mode=debug pour voir les erreurs et en parler sur spip@rezo.net
function affiche_erreurs_page($tableau_des_erreurs) {
$GLOBALS['bouton_admin_debug'] = true;
$res = '';
foreach ($tableau_des_erreurs as $err) {
$res .= "
" .$err[0] . ", ".$err[1]."
\n";
}
return "\n
"
. _T('zbug_erreur_squelette')
## aide locale courte a ecrire, avec lien vers une grosse page de documentation
# aide('erreur_compilation'),
. "
"
. "
"
. $res
. "
";
}
//
// Si une boucle cree des soucis, on peut afficher la requete fautive
// avec son code d'erreur
//
function erreur_requete_boucle($query, $id_boucle, $type, $errno, $erreur) {
$GLOBALS['bouton_admin_debug'] = true;
if (eregi('err(no|code):?[[:space:]]*([0-9]+)', $erreur, $regs))
$errno = $regs[2];
else if (($errno == 1030 OR $errno <= 1026)
AND ereg('[^[:alnum:]]([0-9]+)[^[:alnum:]]', $erreur, $regs))
$errno = $regs[1];
// Erreur systeme
if ($errno > 0 AND $errno < 200) {
$retour .= "
\n"
. _T('info_erreur_systeme2');
spip_log("Erreur systeme $errno");
}
// Requete erronee
else {
$retour .= " \n"
. ""._T('avis_erreur_mysql')." \n"
. htmlspecialchars($query)
. "\n ".htmlspecialchars($erreur)
. " "
. "\n";
include_ecrire('inc_presentation.php3');
include_ecrire('inc_lang.php3');
utiliser_langue_visiteur();
$retour .= aide('erreur_mysql');
spip_log("Erreur requete $id_boucle (".$GLOBALS['fond'].".html)");
}
erreur_squelette($retour);
}
//
// Erreur de syntaxe des squelettes : memoriser le code fautif
//
function erreur_squelette($message='', $lieu='') {
global $tableau_des_erreurs;
global $auteur_session;
static $runs;
if (is_array($message)) list($message, $lieu) = $message;
spip_log("Erreur squelette: $message | $lieu ("
. $GLOBALS['fond'].".html)");
$GLOBALS['bouton_admin_debug'] = true;
$tableau_des_erreurs[] = array($message, $lieu);
// Eviter les boucles infernales
if (++$runs > 4) {
if ($_COOKIE['spip_admin'] OR
$auteur_session['statut'] == '0minirezo' OR
($GLOBALS['var_mode'] == 'debug')) {
echo debut_entete(_T('admin_debug')), '',
affiche_erreurs_page($tableau_des_erreurs);
exit;
}
}
}
//
// Le debusqueur version 3
//
// appelee a chaque sortie de boucle (inc-compilo) et a chaque requete
// dans ce derniers cas on n'a pas le nom du squelette
function boucle_debug_resultat ($id, $type, $resultat) {
global $debug_objets;
$nom = $debug_objets['courant'];
if ($type == 'requete') {
$debug_objets['requete']["$nom$id"] = $resultat;
}
else {
// ne pas memoriser plus de 3 tours d'une meme boucle
if (count($debug_objets['resultat']["$nom$id"]) < 3)
$debug_objets['resultat']["$nom$id"][] = $resultat;
}
}
// appelee a chaque sortie de sequence (inc-compilo)
function debug_sequence($id, $nom, $niv, $sequence) {
global $debug_objets;
if (!$niv)
{
$debug_objets['sequence'][$nom.$id] = $sequence;
}
$res = "";
foreach($sequence as $v) $res .= $v[2];
return $res;
}
// appelee a chaque compilation de boucle (inc-compilo)
function boucle_debug_compile ($id, $nom, $code) {
global $debug_objets;
$debug_objets['code'][$nom.$id] = $code;
}
// appelee a chaque compilation de squelette (inc-compilo)
function squelette_debug_compile($nom, $sourcefile, $code, $squelette) {
global $debug_objets;
$debug_objets['squelette'][$nom] = $squelette;
$debug_objets['sourcefile'][$nom] = $sourcefile;
if (is_array($GLOBALS['contexte_inclus']))
$debug_objets['contexte'][$nom] = $GLOBALS['contexte_inclus'];
else {
$debug_objets['contexte'][$nom] = $GLOBALS['contexte'];
if (!isset($debug_objets['principal']))
$debug_objets['principal'] = $nom;
}
}
// appelee a chaque analyse syntaxique de squelette
function boucle_debug ($nom, $id_parent, $id, $type, $crit, $avant, $milieu, $apres, $altern) {
global $debug_objets;
$debug_objets['courant'] = $nom;
$debug_objets['parent'][$nom.$id] = $id_parent;
$debug_objets['pretty'][$nom.$id] =
"BOUCLE$id($type)" . htmlspecialchars(
preg_replace(",[\r\n],", "\\n", $crit));
// on synthetise avec la syntaxe standard, mais "/" pose pb
$debug_objets['boucle'][$nom.$id] =
(!$avant ? "" : "$avant") .
"" .
$milieu .
"" .
(!$apres ? "" : "$apres") .
(!$altern ? "" : "$altern/B$id>");
}
function trouve_boucle_debug($n, $nom, $debut=0, $boucle = "")
{
global $debug_objets;
$id = $nom . $boucle;
foreach($debug_objets['sequence'][$id] as $v) {
if (!ereg('^(.*)(<\?.*\?>)(.*)$', $v[2],$r))
$y = substr_count($v[2], "\n");
else {
if ($v[1][0] == '#')
// balise dynamique
$incl = $debug_objets['resultat'][$v[0]];
else
// inclusion
$incl = $debug_objets['squelette'][trouve_squelette_inclus($v[1])];
$y = substr_count($incl, "\n")
+ substr_count($r[1], "\n")
+ substr_count($r[3], "\n");
}
if ($n <= ($y + $debut)) {
if ($v[1][0] == '?')
return trouve_boucle_debug($n, $nom, $debut, substr($v[1],1));
elseif ($v[1][0] == '!') {
if ($incl = trouve_squelette_inclus($v[1]))
return trouve_boucle_debug($n, $incl, $debut);
}
return array($nom, $boucle, $v[0]);
}
$debut += $y;
}
return array($nom, $boucle, $n-$debut);
}
function trouve_squelette_inclus($script)
{
global $debug_objets;
// on suppose que X.php appelle le squelette X.html (a revoir)
ereg('^.(.*).php?3', $script, $reg);
$incl = $reg[1] . '.html$';
foreach($debug_objets['sourcefile'] as $k => $v) {
if (ereg($incl,$v)) return $k;
}
return "";
}
function reference_boucle_debug($n, $nom, $self)
{
list($skel, $boucle, $ligne) = trouve_boucle_debug($n, $nom);
if (!$boucle)
return !$ligne ? "" :
(" (" .
(($nom != $skel) ? _L("squelette inclus, ligne: ") :
_L("squelette, ligne: ")) .
"$ligne)");
else {
$self .= "&var_mode_objet=$skel$boucle&var_mode_affiche=boucle";
return !$ligne ? " (boucle $boucle)" :
" (boucle $boucle ligne $ligne)";
}
}
// affiche un texte avec numero de ligne et ancre.
function ancre_texte($texte, $fautifs=array())
{
global $var_mode_ligne;
if ($var_mode_ligne) $fautifs[]=$var_mode_ligne;
ob_start();
highlight_string($texte);
$s = ob_get_contents();
ob_end_clean();
if (substr($s,0,6) == '') { $s=substr($s,6); echo '';}
$tableau = explode(" ", $s);
$format = "%0".
strlen(count($tableau)).
"d ";
$format10=str_replace('black','pink',$format);
$formaterr="%s";
$i=1;
foreach ($tableau as $ligne) {
echo " \n",
sprintf((($i%10) ? $format :$format10), $i),
"",
sprintf(in_array($i, $fautifs) ? $formaterr : '%s',
$ligne) ;
$i++;
}
}
// l'environnement graphique du debuggueur
function debug_dumpfile ($texte, $fonc, $type) {
global $debug_objets, $var_mode_objet, $var_mode_affiche;
$debug_objets[$type][$fonc . 'tout'] = $texte;
if (!$debug_objets['sourcefile']) return;
if ($texte && ($var_mode_objet != $fonc || $var_mode_affiche != $type))
return;
if (!$fonc) $fonc = $debug_objets['principal'];
$link = new Link;
$link->delvar('var_mode_affiche');
$link->delvar('var_mode_objet');
$link->addvar('var_mode','debug');
$self = quote_amp($link->getUrl());
// en cas de squelette inclus, virer le code de l'incluant:
// - il contient souvent une Div restreignant la largeur a 3 fois rien
// - ca fait 2 headers !
ob_end_clean();
@header('Content-Type: text/html; charset='.lire_meta('charset'));
echo debut_entete('Spip ' . $GLOBALS['spip_version_affichee'] . ' ' .
_T('admin_debug') . ' ' .
supprimer_tags(extraire_multi(lire_meta('nom_site')))),
"",
"\n",
"\n
\n";
if ($var_mode_affiche !== 'validation') {
foreach ($debug_objets['sourcefile'] as $nom_skel => $sourcefile) {
echo "\n";
}
echo "