From a7e01c3b9870c5de809747552407349962a29491 Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Tue, 19 Dec 2006 20:33:26 +0000 Subject: [PATCH] =?UTF-8?q?On=20ne=20reproche=20plus=20=C3=A0=20un=20?= =?UTF-8?q?=C3=A9l=C3=A9ment=20d'avoir=20un=20p=C3=A8re=20inconnu,=20il=20?= =?UTF-8?q?n'y=20peut=20rien.=20En=20revanche,=20si=20le=20p=C3=A8re=20est?= =?UTF-8?q?=20connu=20mais=20ne=20reconnait=20pas=20cet=20=C3=A9l=C3=A9men?= =?UTF-8?q?t=20comme=20fils,=20on=20donne=20la=20liste=20des=20p=C3=A8res?= =?UTF-8?q?=20possibles.=20Au=20passage,=20on=20voit=20tout=20ceux=20qui?= =?UTF-8?q?=20sont=20effectivement=20accept=C3=A9s=20par=20la=20DTD,=20le?= =?UTF-8?q?=20validateur=20du=20W3C=20ne=20montrant=20que=20ceux=20politiq?= =?UTF-8?q?uement=20corrects.=20Il=20faut=20les=20voir=20pour=20le=20croir?= =?UTF-8?q?e.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Suite à mon ignorance de la triple accolade dans le Wiki lors des dépots [8061] et [8067], je redonne les globales qu'il faut affecter dans mes_options.php pour utiliser ce validateur (et, en cas de réussite, aussi indenteur fiable depuique que [8090] a trouvé comment contourner le bug de conception de SAX): {{{ $GLOBALS['xml_indent'] = 'sax'; // pour seulement le validateur XML $GLOBALS['xml_validation'] = true; // pour le validateur selon la DTD }}} et je mets en commentaire dans inc/utils ligne 994 de quoi essayer XHTML 1.0 strict pour voir ce que ça donne (pour la non stricte, on ne voit plus grand chose maintenant). --- ecrire/inc/sax.php | 1 + ecrire/inc/utils.php | 5 +++-- ecrire/inc/validateur.php | 31 +++++++++++++++++++++---------- ecrire/public/debug.php | 6 +++--- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/ecrire/inc/sax.php b/ecrire/inc/sax.php index 5e65f34f3a..e5f8ee2ba2 100644 --- a/ecrire/inc/sax.php +++ b/ecrire/inc/sax.php @@ -188,6 +188,7 @@ function xml_parsestring($phraseur, $data) var $ouvrant = array(); var $reperes = array(); var $elements = array(); + var $peres = array(); var $entites = array(); var $attributs = array(); var $ids = array(); diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php index fff139e3e4..f14da669de 100644 --- a/ecrire/inc/utils.php +++ b/ecrire/inc/utils.php @@ -989,8 +989,9 @@ function spip_initialisation($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) { define('_SPIP_DUMP', 'dump@stamp@.xml'); define('_DOCTYPE_ECRIRE', - // "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n"); - "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>"); + // "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n"); + "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>"); + // "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd'>\n"); define('_DOCTYPE_AIDE', "<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Frameset//EN' 'http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd'>"); diff --git a/ecrire/inc/validateur.php b/ecrire/inc/validateur.php index aee7e1b964..e8f7717fd2 100644 --- a/ecrire/inc/validateur.php +++ b/ecrire/inc/validateur.php @@ -50,8 +50,9 @@ function inc_validateur_dist($data) } $phraseur_xml->entites = $res; - // reperer pour chaque noeud ses fils potentiels, sans repetitions, - // pour faire une analyse syntaxique sommaire + // reperer pour chaque noeud ses fils potentiels. + // mais tant pis pour leur eventuel ordre de succession (, * +): + // les cas sont rares et si aberrants que interet/temps-de-calcul -> 0 $res = array(); if (preg_match_all('/<!ELEMENT\s+(\w+)([^>]*)>/', $dtd, $r, PREG_SET_ORDER)) { foreach($r as $m) { @@ -59,8 +60,13 @@ function inc_validateur_dist($data) $val = expanserEntite($val, $phraseur_xml->entites); $val = array_values(preg_split('/\W+/', $val,-1,PREG_SPLIT_NO_EMPTY)); $res[$nom]= $val; + foreach ($val as $k) { + if (!isset($phraseur_xml->peres[$k]) + OR !in_array($nom, $phraseur_xml->peres[$k])) + $phraseur_xml->peres[$k][]= $nom; + } } - } + } $phraseur_xml->elements = $res; $res = array(); @@ -113,13 +119,18 @@ function validerElement($parser, $name, $attrs) if (isset($ouvrant[$depth])) { if (preg_match('/^\s*(\w+)/', $ouvrant[$depth], $r)) { $pere = $r[1]; - if (!@in_array($name, $phraseur_xml->elements[$pere])) - $phraseur_xml->err[]= " <b>$name</b>" - . _L(" n'est pas un fils de ") - . '<b>' - . $pere - . '</b>' - . coordonnees_erreur($parser); + if (isset($phraseur_xml->elements[$pere])) + if (!@in_array($name, $phraseur_xml->elements[$pere])) { + $bons_peres = @join ('</b>, <b>', $phraseur_xml->peres[$name]); + $phraseur_xml->err[]= " <b>$name</b>" + . _L(" n'est pas un fils de ") + . '<b>' + . $pere + . '</b>' + . (!$bons_peres ? '' + : (_L( '<p style="font-size: 80%"> mais de <b>') . $bons_peres . '</b></p>')) + . coordonnees_erreur($parser); + } } } foreach ($phraseur_xml->attributs[$name] as $n => $v) diff --git a/ecrire/public/debug.php b/ecrire/public/debug.php index 1148e4c3f2..13834a53c6 100644 --- a/ecrire/public/debug.php +++ b/ecrire/public/debug.php @@ -538,7 +538,7 @@ function emboite_texte($texte, $fonc='',$self='') $GLOBALS['xhtml_error'], $regs, PREG_SET_ORDER); - $err = '<tr><th>#</th><th>Occ.</th><th>Msg</th><th>L</th><th>Col</th></tr>'; + $err = '<tr><th>#</th><th>Occ.</th><th>Li.</th><th>Col.</th><th>Err.</th></tr>'; $fautifs = array(); $i = 0; $encore = array(); @@ -560,14 +560,14 @@ function emboite_texte($texte, $fonc='',$self='') . "'><td style='text-align: right'>" . $i . "</td><td style='text-align: right'>" - . "$ref/$encore[$msg]</td><td>$msg</td>" + . "$ref/$encore[$msg]</td>" . "<td style='text-align: right'><a href='#L" . $ligne . "' id='T$i'>" . $ligne . "</a></td><td style='text-align: right'>" . $fin - . "</td></tr>\n"; + . "</td><td>$msg</td></tr>\n"; $fautifs[]= array($ligne, $col, $i); } return array(ancre_texte($texte, $fautifs), -- GitLab