From ebbdca90affa6e30a06ac7a604dad58e0cc599a2 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Wed, 8 Dec 2010 08:52:27 +0000
Subject: [PATCH] Reports : Report de r16556. Le find_in_path pour la DTD
 locale introduit par r15963 n'etait pas assez general car contraint en amont
 par le prefixe 'prive' Report de r16558 Accepter dans une DTD un element a 
 contenu totalement vide (meme pas EMPTY explicite). Report r16560. Creer le
 repertoire de cache des DTD (source et compilee) en debut d'analyse, dans le
 cas d'une DTD locale qu'on ne recopie pas, l'ecriture du cache echoue s'il
 n'est pas la (Eric).

---
 ecrire/xml/analyser_dtd.php | 12 +++++++-----
 ecrire/xml/sax.php          |  2 +-
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/ecrire/xml/analyser_dtd.php b/ecrire/xml/analyser_dtd.php
index 6b570e1a85..4c114a8f78 100644
--- a/ecrire/xml/analyser_dtd.php
+++ b/ecrire/xml/analyser_dtd.php
@@ -25,8 +25,7 @@ function charger_dtd($grammaire, $avail, $rotlvl)
 
 	if (lire_fichier($file, $r)) {
 		if ($avail == 'SYSTEM') {
-			$src = find_in_path($grammaire);
-			if (!$src OR filemtime($file) < filemtime($src))
+			if (!$grammaire OR filemtime($file) < filemtime($grammaire))
 				$r = false;
 		}
 	}
@@ -81,10 +80,13 @@ function compilerRegle($val)
 // http://doc.spip.org/@analyser_dtd
 function analyser_dtd($loc, $avail, &$dtc)
 {
+	// creer le repertoire de cache si ce n'est fait
+	// (utile aussi pour le resultat de la compil)
+	$file = sous_repertoire(_DIR_CACHE_XML);
+	// si DTD locale, ignorer ce repertoire pour le moment
 	if ($avail == 'SYSTEM')
 	  $file = find_in_path($loc);
 	else {
-	  $file = sous_repertoire(_DIR_CACHE_XML);
 	  $file .= preg_replace('/[^\w.]/','_', $loc);
 	}
 
@@ -249,7 +251,7 @@ function analyser_dtd_entity($dtd, &$dtc, $grammaire)
 // http://doc.spip.org/@analyser_dtd_element
 function analyser_dtd_element($dtd, &$dtc, $grammaire)
 {
-	if (!preg_match('/^<!ELEMENT\s+(\S+)\s+([^>]*)>\s*(.*)$/s', $dtd, $m))
+	if (!preg_match('/^<!ELEMENT\s+([^>%\s]+)([^>]*)>\s*(.*)$/s', $dtd, $m))
 		return -3;
 
 	list(,$nom, $contenu, $dtd) = $m;
@@ -261,7 +263,7 @@ function analyser_dtd_element($dtd, &$dtc, $grammaire)
 	}
 	$filles = array();
 	$contenu = expanserEntite($contenu, $dtc->macros);
-	$val = compilerRegle($contenu);
+	$val = $contenu ? compilerRegle($contenu) : '(EMPTY )';
 	if ($val == '(EMPTY )')
 		$dtc->regles[$nom] = 'EMPTY';
 	elseif  ($val == '(ANY )') 
diff --git a/ecrire/xml/sax.php b/ecrire/xml/sax.php
index a608b489cc..ada8fe531a 100644
--- a/ecrire/xml/sax.php
+++ b/ecrire/xml/sax.php
@@ -248,7 +248,7 @@ function analyser_doctype($data)
 					     $pico);
 			else {
 				$dtd = $topelement . '.dtd';
-				$f = _DIR_RACINE . 'prive/' . $dtd;
+				$f = find_in_path($dtd);
 				if (file_exists($f))
 					return array('', $topelement, 'SYSTEM', $f, $dtd, $pico);
 			}
-- 
GitLab