From 62b62e353407412ab421bd57fed7f7a906e85d15 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Tue, 23 Jan 2007 23:33:01 +0000
Subject: [PATCH] "un tour de passe passe avec le doctype et sax (qui le mange
 en php 5). la fonction sax_bug porte encore un peu mieux son nom, et se
 charge d'escamoter le doctype de la page, et de le renvoyer separemment, pour
 pouvoir le recoller en tete apres analyse. En esperant ne rien avoir casse
 dans les scenarii php4"

---
 ecrire/inc/sax.php      | 22 ++++++++++++++--------
 ecrire/public/debug.php |  2 +-
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/ecrire/inc/sax.php b/ecrire/inc/sax.php
index 085a7c7e37..c8da196701 100644
--- a/ecrire/inc/sax.php
+++ b/ecrire/inc/sax.php
@@ -192,15 +192,19 @@ function inc_sax_dist($page, $apply=false)
 		ob_end_clean();
 	}
 
-	// charger la DTD et transcoder les entites
-	$res = $phraseur_xml->phraserTout($xml_parser, sax_bug($page));
+	// charger la DTD et transcoder les entites,
+	// et escamoter le doctype que sax mange en php 5
+	list($doctype,$page) = sax_bug($page);
+
+	$res = $phraseur_xml->phraserTout($xml_parser, $page);
 
 	xml_parser_free($xml_parser);
 
-	if ($res[0] == '<') return $res;
+	if ($res[0] == '<') return $doctype ."\n". $res;
 
 	$GLOBALS['xhtml_error'] = $res;
-	return $page;
+
+	return $doctype . $page;
 }
 
 // SAX ne dit pas si une Entite est dans un attribut ou non.
@@ -214,12 +218,14 @@ function inc_sax_dist($page, $apply=false)
 function sax_bug($data)
 {
 	global  $phraseur_xml;
+	$doctype = "";
 
 	$r = analyser_doctype($data);
 	if (!$r)
 		$data = html2unicode($data, true);
 	else  {
-		list ($topelement, $avail, $grammaire, $rotlvl) = $r;
+		list ($doctype, $topelement, $avail, $grammaire, $rotlvl) = $r;
+		$data = substr($data,strlen($doctype));
 		$file = _DIR_CACHE_XML . preg_replace('/[^\w.]/','_', $rotlvl) . '.gz';
 		if (lire_fichier($file, $r))
 			$phraseur_xml->dtc = unserialize($r);
@@ -236,7 +242,7 @@ function sax_bug($data)
 		    $trans["&$k;"] = $v;
 		$data = strtr($data, $trans);
 	}
-	return unicode2charset($data);
+	return array($doctype,unicode2charset($data));
 }
 
 // http://doc.spip.org/@analyser_doctype
@@ -245,7 +251,7 @@ function analyser_doctype($data)
 	if (!preg_match(_REGEXP_DOCTYPE, $data, $r))
 		return array();
 
-	list(,,$topelement, $avail,$suite) = $r;
+	list($doctype,,$topelement, $avail,$suite) = $r;
 
 	if (!preg_match('/^"([^"]*)"\s*(.*)$/', $suite, $r))
 		if (!preg_match("/^'([^']*)'\s*(.*)$/", $suite, $r))
@@ -261,7 +267,7 @@ function analyser_doctype($data)
 				return array();
 		$grammaire = $r[1];
 	}
-	return array($topelement, $avail, $grammaire, $rotlvl);
+	return array($doctype, $topelement, $avail, $grammaire, $rotlvl);
 }
 
 ?>
diff --git a/ecrire/public/debug.php b/ecrire/public/debug.php
index f0c18ecbc5..c92a0272d0 100644
--- a/ecrire/public/debug.php
+++ b/ecrire/public/debug.php
@@ -487,7 +487,7 @@ function debug_script ($t) {
 
 	debug_debut($GLOBALS['exec']);
 	if (!isset($GLOBALS['xhtml_error'])) {
-		list ($top, $avail, $grammaire, $rotlvl) = analyser_doctype($t);
+		list (,$top, $avail, $grammaire, $rotlvl) = analyser_doctype($t);
 		$err = '<h3>' . _T('spip_conforme_dtd')
 		. "<br /><a href='" 
 		. $grammaire
-- 
GitLab