Valider cabb8470 rédigé par esj's avatar esj
Parcourir les fichiers

Suite de [8061]: mini-analyse syntaxique selon la DTD dans le validateur XML.

Sans aller jusqu'à une analyse syntaxique digne d'un vrai validateur, le petit validateur XML controle quand meme si une balise est une fille légitime de sa mère. Ca ne controle pas l'ordre (par exemple mettre Body avant Head ne sera pas dénoncé) mais ça controle bien la hiérarchie (Div après P interdit; P après Div accepté etc).

Le temps de calcul devenant perceptible, toute cette validation est désormais controlé par la globale:
$GLOBALS['xml_validation']= 'sax';
à mettre dans mes_options.php.
parent 8842e225
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+4 −5
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -34,11 +34,11 @@ function exec_articles_page_dist()
	$result = spip_query("SELECT id_rubrique FROM spip_rubriques LIMIT 1");

	if (spip_num_rows($result) > 0) {
	  echo bloc_des_raccourcis(icone_horizontale(_T('icone_ecrire_article'), generer_url_ecrire("articles_edit","new=oui"), "article-24.gif", "creer.gif", '', true));
	  echo bloc_des_raccourcis(icone_horizontale(_T('icone_ecrire_article'), generer_url_ecrire("articles_edit","new=oui"), "article-24.gif", "creer.gif", true));
	} else {
		if ($connect_statut == '0minirezo') {
		  echo _T('texte_creer_rubrique');
		  echo	bloc_des_raccourcis(icone_horizontale (_T('icone_creer_rubrique'), generer_url_ecrire("rubriques_edit","new=oui&retour=nav"), "rubrique-24.gif", "creer.gif", '',true));
		  echo	bloc_des_raccourcis(icone_horizontale (_T('icone_creer_rubrique'), generer_url_ecrire("rubriques_edit","new=oui&retour=nav"), "rubrique-24.gif", "creer.gif",true));
	}
}

@@ -51,7 +51,7 @@ debut_droite();
// Vos articles en cours de redaction
//

 echo "<P align=left>", afficher_articles(_T('info_en_cours_validation'), array('FROM' => "spip_articles AS articles, spip_auteurs_articles AS lien ", "WHERE" => "articles.id_article=lien.id_article AND lien.id_auteur=$connect_id_auteur AND articles.statut='prepa'", 'ORDER BY' => "articles.date DESC"));
 echo "<p align='left'>", afficher_articles(_T('info_en_cours_validation'), array('FROM' => "spip_articles AS articles, spip_auteurs_articles AS lien ", "WHERE" => "articles.id_article=lien.id_article AND lien.id_auteur=$connect_id_auteur AND articles.statut='prepa'", 'ORDER BY' => "articles.date DESC"));
echo "</p>";


@@ -67,8 +67,7 @@ echo "</p>";
// Vos articles publies
//

 echo "<p>", afficher_articles(_T('info_publies'),	array("FROM" =>"spip_articles AS articles, spip_auteurs_articles AS lien ", "WHERE" => "articles.id_article=lien.id_article AND lien.id_auteur=\"$connect_id_auteur\" AND articles.statut='publie'", 'ORDER BY' => "articles.date DESC"));
echo "</p>";
 echo afficher_articles(_T('info_publies'),	array("FROM" =>"spip_articles AS articles, spip_auteurs_articles AS lien ", "WHERE" => "articles.id_article=lien.id_article AND lien.id_auteur=\"$connect_id_auteur\" AND articles.statut='publie'", 'ORDER BY' => "articles.date DESC"));

//
//  Vos articles refuses
+2 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -204,7 +204,8 @@ function inc_sax_dist($page, $apply=false) {
		$page = ob_get_contents();
		ob_end_clean();
	}
	if ($validateur = charger_fonction('validateur', 'inc', true))
	if ($GLOBALS['xml_validation']
	AND $validateur = charger_fonction('validateur', 'inc', true))
		$validateur($page);
	$res = $phraseur_xml->xml_parsestring($xml_parser, $page);
	xml_parser_free($xml_parser);
+45 −14
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -27,33 +27,35 @@ function inc_validateur_dist($data)

	include_spip('inc/distant');
	$dtd = recuperer_page($grammaire);
	preg_match_all('/<!ELEMENT\s+(\w+)[^>]*>/', $dtd, $r);
	$phraseur_xml->elements = $r[1];

	$res = array();
	// on ignore les entites publiques. A ameliorer a terme
	if (preg_match_all('/<!ENTITY\s+%\s+([.\w]+)\s+"([^"]*)"\s*>/', $dtd, $r, PREG_SET_ORDER)) {
	  foreach($r as $m) {
	    list(,$nom, $val) = $m;
	    if (preg_match_all('/%([.\w]+);/', $val, $r2, PREG_SET_ORDER)) {
	      foreach($r2 as $m2)
		$val = str_replace($m2[0], $res[$m2[1]], $val);
	    $res[$nom] =  expanserEntite($val, $res);
	  }
	}
	$phraseur_xml->entites = $res;

	// reperer pour chaque noeud ses fils potentiels, sans repetitions,
	// pour faire une analyse syntaxique sommaire
	$res = array();
	if (preg_match_all('/<!ELEMENT\s+(\w+)([^>]*)>/', $dtd, $r, PREG_SET_ORDER)) {
	  foreach($r as $m) {
	    list(,$nom, $val) = $m;
	    $val = expanserEntite($val, $phraseur_xml->entites);
	    $val = array_values(preg_split('/\W+/', $val));
	    $res[$nom]= $val;
	  }
	}
	$phraseur_xml->entites = $res;
	$phraseur_xml->elements = $res;

	$res = array();
	if (preg_match_all('/<!ATTLIST\s+(\S+)\s+([^>]*)>/', $dtd, $r, PREG_SET_ORDER)) {
	  foreach($r as $m) {
	    list(,$nom, $val) = $m;
	    if (preg_match_all('/%([.\w]+);/', $val, $r2, PREG_SET_ORDER)) {
		foreach($r2 as $m2)
	  // parfois faux suite au non chargement des entites publiques
		  if ($x = $phraseur_xml->entites[$m2[1]])
		    $val = str_replace($m2[0], $x, $val);
	    }
	    $val = expanserEntite($val, $phraseur_xml->entites);
	    $att = array();
	    if (preg_match_all("/\s*(\S+)\s+(([(][^)]*[)])|(\S+))\s+(\S+)(\s*'[^']*')?/", $val, $r2, PREG_SET_ORDER)) {
	      foreach($r2 as $m2)
@@ -65,13 +67,24 @@ function inc_validateur_dist($data)
	$phraseur_xml->attributs = $res;
}

function expanserEntite($val, $entites)
{
	if (preg_match_all('/%([.\w]+);/', $val, $r, PREG_SET_ORDER)) {
		foreach($r as $m)
	  // parfois faux suite au non chargement des entites publiques
			if ($x = $entites[$m[1]])
				$val = str_replace($m[0], $x, $val);
	}
	return $val;
}

function validerElement($parser, $name)
{
	global $phraseur_xml;

	if (!$phraseur_xml->elements) return;

	if (!in_array($name, $phraseur_xml->elements))
	if (!isset($phraseur_xml->elements[$name]))

		$phraseur_xml->err[]= $name 
		. '&nbsp;:&nbsp;'
@@ -79,6 +92,24 @@ function validerElement($parser, $name)
		. _L('ligne ')
		. xml_get_current_line_number($parser)
		. '<br />';
	else {
	  $depth = $phraseur_xml->depth;
	  $ouvrant = $phraseur_xml->ouvrant;
	  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[]= $name 
		. '&nbsp;:&nbsp;'
		. _L(" n'est pas un fils de <b>")
		. $pere
		. _L('</b> ligne ')
		. xml_get_current_line_number($parser)
		. '<br />';
	    }
	  }

	}
}