From 71568fb9efdc5ffca6bed67fd712a670fa1b9cdf Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Fri, 10 Nov 2006 08:45:31 +0000
Subject: [PATCH] =?UTF-8?q?Le=20validateur=20xml=20int=C3=A9gr=C3=A9=20?=
 =?UTF-8?q?=C3=A0=20Spip=20et=20appelable=20depuis=20le=20d=C3=A9busqueur?=
 =?UTF-8?q?=20souffrait=20de=20quelques=20incoh=C3=A9rences=20(depuis=20l'?=
 =?UTF-8?q?introduction=20du=20plugin=20"affichage=5Ffinal"=20peut-etre).?=
 =?UTF-8?q?=20Il=20est=20=C3=A0=20nouveau=20accessible,=20en=20mettant=20'?=
 =?UTF-8?q?$xhtml=20=3D=20"sax";'=20dans=20mes=5Foptions.=20La=20d=C3=A9du?=
 =?UTF-8?q?ction=20de=20la=20ligne=20fautive=20dans=20le=20squelette=20?=
 =?UTF-8?q?=C3=A0=20partir=20de=20la=20ligne=20fautive=20dans=20le=20r?=
 =?UTF-8?q?=C3=A9sultat=20ne=20remarche=20en=20revanche=20pas=20encore,=20?=
 =?UTF-8?q?mais=20le=20probl=C3=A8me=20a=20l'air=20plus=20g=C3=A9n=C3=A9ra?=
 =?UTF-8?q?l=20car=20les=20arguments=20de=20debug=5Fsequence=20d=C3=A9clen?=
 =?UTF-8?q?che=20un=20Warning=20sur=20le=20modele=20"pagination".=20Tout?=
 =?UTF-8?q?=20=C3=A7a=20est=20neutralis=C3=A9=20par=20un=20@=20ligne=20450?=
 =?UTF-8?q?=20de=20compiler.php,=20et=20un=20test=20pr=C3=A9ventif=20ligne?=
 =?UTF-8?q?=20235=20de=20debug.php=20mais=20il=20faudra=20y=20revenir.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/balise/formulaire_admin.php |  2 +-
 ecrire/inc/sax.php                 | 29 +++++-----
 ecrire/public/assembler.php        |  3 +-
 ecrire/public/compiler.php         |  2 +-
 ecrire/public/debug.php            | 92 ++++++++++++++++++------------
 5 files changed, 70 insertions(+), 58 deletions(-)

diff --git a/ecrire/balise/formulaire_admin.php b/ecrire/balise/formulaire_admin.php
index f994aa99ba..e4fc5292d2 100644
--- a/ecrire/balise/formulaire_admin.php
+++ b/ecrire/balise/formulaire_admin.php
@@ -107,7 +107,7 @@ function balise_FORMULAIRE_ADMIN_dyn($float='', $debug='') {
 		)
 	) ? parametre_url(self(),'var_mode', 'debug', '&'): '';
 	$analyser = !$xhtml ? "" :
-		(($xhtml === 'spip_sax') ?
+		(($xhtml === 'sax') ?
 		(parametre_url(self(), 'var_mode', 'debug', '&')
 			.'&var_mode_affiche=validation') :
 		('http://validator.w3.org/check?uri='
diff --git a/ecrire/inc/sax.php b/ecrire/inc/sax.php
index da86c2d793..09fa79194f 100644
--- a/ecrire/inc/sax.php
+++ b/ecrire/inc/sax.php
@@ -109,7 +109,7 @@ function defautElement($parser, $data)
   $depth = &$phraseur_xml->depth;
   $contenu = &$phraseur_xml->contenu;
 
-  $contenu[$depth] .= $data;
+  @$contenu[$depth] .= $data;
 }
 
 // http://doc.spip.org/@translate_entities
@@ -151,7 +151,7 @@ function xml_parsestring($xml_parser, $data)
 	    xml_get_current_line_number($xml_parser) .
 	    _L(" colonne ") .
 	    xml_get_current_column_number($xml_parser) .
-	    (!$depth ? '' :
+	    (!$phraseur_xml->depth ? '' :
 	     ('<br />' .
 	      _L("derni&egrave;re balise non referm&eacute;e&nbsp;: ") .
 	      "<tt>" .
@@ -162,7 +162,6 @@ function xml_parsestring($xml_parser, $data)
 
 	} else $r = $phraseur_xml->res;
 
-	xml_parser_free($xml_parser);
 	return $r;
 }
 
@@ -173,23 +172,21 @@ var $ouvrant = array();
 var $reperes = array();
 }
 
-// xml_set_objet a utiliser a terme
-global $phraseur_xml, $xml_parser;
-$phraseur_xml = new PhraseurXML();
-
-$xml_parser = xml_parser_create($GLOBALS['meta']['charset']);
-xml_set_element_handler($xml_parser,
-			array($phraseur_xml, "debutElement"),
-			array($phraseur_xml, "finElement"));
-xml_set_character_data_handler($xml_parser, array($phraseur_xml, "textElement"));
-xml_set_processing_instruction_handler($xml_parser, array($phraseur_xml, 'PiElement'));
-xml_set_default_handler($xml_parser, array($phraseur_xml, "defautElement"));
-xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
-
 // http://doc.spip.org/@inc_sax_dist
 function inc_sax_dist($page) {
 	global $phraseur_xml, $xml_parser, $xhtml_error;
+	$phraseur_xml = new PhraseurXML();
+
+	$xml_parser = xml_parser_create($GLOBALS['meta']['charset']);
+	xml_set_element_handler($xml_parser,
+			array($phraseur_xml, "debutElement"),
+			array($phraseur_xml, "finElement"));
+	xml_set_character_data_handler($xml_parser, array($phraseur_xml, "textElement"));
+	xml_set_processing_instruction_handler($xml_parser, array($phraseur_xml, 'PiElement'));
+	xml_set_default_handler($xml_parser, array($phraseur_xml, "defautElement"));
+	xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
 	$res = $phraseur_xml->xml_parsestring($xml_parser, $page);
+	xml_parser_free($xml_parser);
 	if ($res[0] != '<')
 	  $xhtml_error = $res;
 	else
diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index 947a346e24..dc1b8c2e63 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
@@ -315,8 +315,7 @@ function f_tidy ($texte) {
 	AND (_request('var_fragment') === NULL)
 	AND !headers_sent()) {
 		# Compatibilite ascendante
-		if ($xhtml === true) $xhtml ='tidy';
-		else if ($xhtml == 'spip_sax') $xhtml = 'sax';
+		if (!is_string($xhtml)) $xhtml ='tidy';
 
 		if ($f = charger_fonction($xhtml, 'inc'))
 			$texte = $f($texte);
diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index 27c739428c..793bbd7f53 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -447,7 +447,7 @@ function calculer_liste($tableau, $descr, &$boucles, $id_boucle='') {
 	  return
 		(($n==1) ? $codes[0] : 
 			 "(" . join (" .\n$tab", $codes) . ")");
-	else return "debug_sequence('$id_boucle', '" .
+	else return "@debug_sequence('$id_boucle', '" .
 	  ($descr['nom']) .
 	  "', " .
 	  $descr['niv'] .
diff --git a/ecrire/public/debug.php b/ecrire/public/debug.php
index ee9ed71479..c8d2c5aed5 100644
--- a/ecrire/public/debug.php
+++ b/ecrire/public/debug.php
@@ -232,6 +232,7 @@ function trouve_boucle_debug($n, $nom, $debut=0, $boucle = "")
 	global $debug_objets;
 
 	$id = $nom . $boucle;
+	if (!is_array($debug_objets['sequence'][$id])) return array();
 	foreach($debug_objets['sequence'][$id] as $v) {
 	  if (!preg_match('/^(.*)(<\?.*\?>)(.*)$/s', $v[2],$r))
 	    $y = substr_count($v[2], "\n");
@@ -307,8 +308,9 @@ function ancre_texte($texte, $fautifs=array())
 {
 	global $var_mode_ligne;
 	if ($var_mode_ligne) $fautifs[]=$var_mode_ligne;
+	$res ='';
 	$s = highlight_string($texte,true);
-	if (substr($s,0,6) == '<code>') { $s=substr($s,6); echo '<code>';}
+	if (substr($s,0,6) == '<code>') { $s=substr($s,6); $res = '<code>';}
 	$tableau = explode("<br />", $s);
 
 	$n = strlen(count($tableau));
@@ -321,11 +323,12 @@ function ancre_texte($texte, $fautifs=array())
 	$i=1;
 
 	foreach ($tableau as $ligne) {
-		echo "<br />\n",
-		  sprintf((($i%10) ? $format :$format10), $i, $i),
-		  sprintf(in_array($i, $fautifs) ? $formaterr : '%s', $ligne);
+		$res .= "<br />\n"
+		.  sprintf((($i%10) ? $format :$format10), $i, $i)
+		.  sprintf(in_array($i, $fautifs) ? $formaterr : '%s', $ligne);
 		$i++;
 	}
+	return $res;
 }
 
 // l'environnement graphique du debuggueur 
@@ -417,56 +420,46 @@ function debug_dumpfile ($texte, $fonc, $type) {
 	    echo "<div id=\"debug_boucle\"><fieldset>";
 	    if ($var_mode_affiche == 'resultat') {
 		echo "<legend>",$debug_objets['pretty'][$var_mode_objet],"</legend>";
-		ancre_texte(traite_query($debug_objets['requete'][$var_mode_objet]));
+		echo ancre_texte(traite_query($debug_objets['requete'][$var_mode_objet]));
 		foreach ($res as $view) 
 			if ($view) echo "\n<br /><fieldset>",interdire_scripts($view),"</fieldset>";
 
 	    } else if ($var_mode_affiche == 'code') {
 		echo  "<legend>",$debug_objets['pretty'][$var_mode_objet],"</legend>";
-		ancre_texte("<"."?php\n".$res."\n?".">");
+		echo ancre_texte("<"."?php\n".$res."\n?".">");
 	    } else if ($var_mode_affiche == 'boucle') {
 		echo  "<legend>",$debug_objets['pretty'][$var_mode_objet],"</legend>";
-		ancre_texte($res);
+		echo ancre_texte($res);
 	    } else if ($var_mode_affiche == 'squelette') {
 		echo  "<legend>",$debug_objets['sourcefile'][$var_mode_objet],"</legend>";
-		ancre_texte($debug_objets['squelette'][$var_mode_objet]);
+		echo ancre_texte($debug_objets['squelette'][$var_mode_objet]);
 	    }
 	    echo "</fieldset></div>";
 	  }
 	}
+
 	if ($texte) {
 
-	  $ouvrant = $fermant = $err = "";
-	  $titre = $GLOBALS['var_mode_affiche'];
-	  if ($titre != 'validation') {
-	    $titre = 'zbug_' . $titre;
-	  }
+		$err = "";
+		$titre = $GLOBALS['var_mode_affiche'];
+		if ($titre != 'validation') {
+			$titre = 'zbug_' . $titre;
+			$texte = ancre_texte($texte, array('',''));
+		} else {
+		  list($texte, $err) = emboite_texte($texte, $self);
+			if ($err === false)
+				$err = _T('impossible');
+			elseif ($err === true)
+			  $err = _T('correcte');
+		}
 
-	  else if ($sax = charger_fonction('sax', 'inc')
-	  AND $res = $sax($texte)) {
-	     if (ereg("^[[:space:]]*([^<][^0-9]*)([0-9]*)(.*[^0-9])([0-9]*)$", $GLOBALS['xhtml_error'], $r)) {
-		$fermant = $r[2];
-		$ouvrant = $r[4];
-		$rf = reference_boucle_debug($fermant, $fonc, $self);
-		$ro = reference_boucle_debug($ouvrant, $fonc, $self);
-		$err = ": " . $r[1] .
-		  "<a href='#L" . $r[2] . "'>$r[2]</a>$rf" .
-		  $r[3] ."<a href='#L" . $r[4] . "'>$r[4]</a>$ro";
-	      } else {
-		  $err = _T('correcte');
-		  $texte = $res;
-	      }
-	  }
-		else
-			$err = _T('impossible');
-
-	  echo "<div id=\"debug_boucle\"><fieldset><legend>",
-	    _T($titre),	       
-	    ' ',
-	    $err,
-	    "</legend>";
-	  ancre_texte($texte, array($ouvrant, $fermant));
-	  echo "</fieldset></div>";
+		echo "<div id=\"debug_boucle\"><fieldset><legend>",
+		  _T($titre),	       
+		  ' ',
+		  $err,
+		  "</legend>";
+		echo $texte;
+		echo "</fieldset></div>";
 	}
 	echo "\n</div>";
 	include_spip('balise/formulaire_admin');
@@ -476,4 +469,27 @@ function debug_dumpfile ($texte, $fonc, $type) {
 	echo '</body></html>';
 	exit;
 }
+
+function emboite_texte($texte,$self='')
+{
+	if (!($sax = charger_fonction('sax', 'inc') AND $res = $sax($texte)))
+		return array(ancre_texte($texte, array('','')), false);
+	elseif (!ereg("^[[:space:]]*([^<][^0-9]*)([0-9]*)(.*[^0-9])([0-9]*)$",
+		     $GLOBALS['xhtml_error'],
+		     $r))
+		return array(ancre_texte($texte, array('', '')), true);
+	else {
+		$fermant = $r[2];
+		$ouvrant = $r[4];
+		if (isset($GLOBALS['debug_objets'])) {
+		  $rf = reference_boucle_debug($fermant, $fonc, $self);
+		  $ro = reference_boucle_debug($ouvrant, $fonc, $self);
+		} else $rf = $ro = '';
+		$err = ": " . $r[1] .
+		  "<a href='#L" . $r[2] . "'>$r[2]</a>$rf" .
+		  $r[3] ."<a href='#L" . $r[4] . "'>$r[4]</a>$ro";
+		return array(ancre_texte($texte, array($ouvrant, $fermant)), $err);
+	}
+}
+
 ?>
-- 
GitLab