Skip to content
Extraits de code Groupes Projets
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
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -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
......
......@@ -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);
......
......@@ -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] = $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->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 />';
}
}
}
}
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter