Skip to content
Extraits de code Groupes Projets
Valider 7e8fe71d rédigé par esj's avatar esj
Parcourir les fichiers

Simplification de l'interface à l'indenteur/validateur, d'une part pour que...

Simplification de l'interface à l'indenteur/validateur, d'une part pour que l'indenteur ne s'encombre pas des données du validateur, et pour qu'on puisse écrire des validateur meilleurs que celui du W3C en récupérant un maximum de code. Il y a peu de programmation objet, mais entre les incompatibilités de PHP4 et PHP5 sur la question, et la folie de la sémantique de référence dans les deux cas, c'est minimal.

A présent, il faut affecter dans mes_options.php une seule variable, qui sera le nom passé à charger_fonction à la fin de ecrire/index.php:

{{{
$GLOBALS['transformer_xml'] = 'indenter_xml';  // pour l'indenteur XML
$GLOBALS['transformer_xml'] = 'valider_xml';  // pour le validateur par DTD
}}}

Les spécifications de [8136] n'auront donc vécu que le temps de 13 dépots.
parent faa4ad0b
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -486,6 +486,7 @@ ecrire/inc/import_0_0.php -text ...@@ -486,6 +486,7 @@ ecrire/inc/import_0_0.php -text
ecrire/inc/import_1_2.php -text ecrire/inc/import_1_2.php -text
ecrire/inc/import_1_3.php -text ecrire/inc/import_1_3.php -text
ecrire/inc/import_insere.php -text ecrire/inc/import_insere.php -text
ecrire/inc/indenter_xml.php -text
ecrire/inc/informer.php -text ecrire/inc/informer.php -text
ecrire/inc/informer_auteur.php -text ecrire/inc/informer_auteur.php -text
ecrire/inc/instituer_article.php -text ecrire/inc/instituer_article.php -text
...@@ -515,7 +516,7 @@ ecrire/inc/syndic.php -text ...@@ -515,7 +516,7 @@ ecrire/inc/syndic.php -text
ecrire/inc/tourner.php -text ecrire/inc/tourner.php -text
ecrire/inc/traduire.php -text ecrire/inc/traduire.php -text
ecrire/inc/utils.php -text ecrire/inc/utils.php -text
ecrire/inc/validateur.php -text ecrire/inc/valider_xml.php -text
ecrire/inc/vieilles_defs.php -text ecrire/inc/vieilles_defs.php -text
ecrire/inc/virtualiser.php -text ecrire/inc/virtualiser.php -text
ecrire/inc/xml.php -text ecrire/inc/xml.php -text
......
...@@ -66,7 +66,7 @@ function inc_formater_article_dist($row) ...@@ -66,7 +66,7 @@ function inc_formater_article_dist($row)
. $dir_lang . $dir_lang
. " style=\"display:block;\">" . " style=\"display:block;\">"
. (!$logo ? '' : . (!$logo ? '' :
("<div style='float: $spip_lang_right; margin-top: -2px; margin-bottom: -2px;'>" . $logo . "</div>")) ("<span style='float: $spip_lang_right; margin-top: -2px; margin-bottom: -2px;'>" . $logo . "</span>"))
. (acces_restreint_rubrique($id_rubrique) ? $img_admin : '') . (acces_restreint_rubrique($id_rubrique) ? $img_admin : '')
. typo($titre) . typo($titre)
. (!($afficher_langue AND $lang != $GLOBALS['meta']['langue_site']) ? '' : . (!($afficher_langue AND $lang != $GLOBALS['meta']['langue_site']) ? '' :
......
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2007 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/sax');
class IndenteurXML {
function debutElement($phraseur, $name, $attrs)
{ xml_debutElement($phraseur, $name, $attrs);}
function finElement($phraseur, $name)
{ xml_finElement($phraseur, $name);}
function textElement($phraseur, $data)
{ xml_textElement($phraseur, $data);}
function PiElement($phraseur, $target, $data)
{ xml_PiElement($phraseur, $target, $data);}
function defautElement($phraseur, $data)
{ xml_defautElement($phraseur, $data);}
function phraserTout($phraseur, $data)
{
xml_parsestring($phraseur, $data);
return !$this->err ? $this->res : join('<br />', $this->err) . '<br />';
}
var $depth = "";
var $res = "";
var $err = array();
var $contenu = array();
var $ouvrant = array();
var $reperes = array();
var $entites = array();
}
function inc_indenter_xml_dist($page, $apply=false)
{
$sax = charger_fonction('sax', 'inc');
return $sax($page, $apply, $GLOBALS['phraseur_xml'] = new IndenteurXML());
}
?>
...@@ -131,7 +131,7 @@ function choix_statut_auteur($statut, $ancre) { ...@@ -131,7 +131,7 @@ function choix_statut_auteur($statut, $ancre) {
global $connect_toutes_rubriques; global $connect_toutes_rubriques;
$menu = "<select name='statut' size='1' class='fondl' $menu = "<select name='statut' size='1' class='fondl'
onChange=\"findObj_forcer('$ancre').style.visibility = (this.selectedIndex ? 'hidden' : 'visible');\">"; onchange=\"findObj_forcer('$ancre').style.visibility = (this.selectedIndex ? 'hidden' : 'visible');\">";
// Si on est admin restreint, on n'a pas le droit de modifier un admin // Si on est admin restreint, on n'a pas le droit de modifier un admin
if ($connect_toutes_rubriques) if ($connect_toutes_rubriques)
......
...@@ -15,147 +15,121 @@ if (!defined("_ECRIRE_INC_VERSION")) return; ...@@ -15,147 +15,121 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/filtres'); include_spip('inc/filtres');
include_spip('inc/charsets'); include_spip('inc/charsets');
// http://doc.spip.org/@PhraseurXML
class PhraseurXML {
// http://doc.spip.org/@debutElement // http://doc.spip.org/@debutElement
function debutElement($parser, $name, $attrs) function xml_debutElement($parser, $name, $attrs)
{ {
global $phraseur_xml; global $phraseur_xml;
$depth = &$phraseur_xml->depth;
if ($phraseur_xml->elements) $contenu = &$phraseur_xml->contenu;
validerElement($parser, $name, $attrs); $ouvrant = &$phraseur_xml->ouvrant;
$reperes = &$phraseur_xml->reperes;
$depth = &$phraseur_xml->depth;
$contenu = &$phraseur_xml->contenu; $t = isset($ouvrant[$depth]) ? $ouvrant[$depth] : ' ';
$ouvrant = &$phraseur_xml->ouvrant; // espace initial signifie: deja integree au resultat
$reperes = &$phraseur_xml->reperes; if ($t[0] != ' ')
$res = &$phraseur_xml->res; {
$phraseur_xml->res .= '<' . $t . '>';
$t = isset($ouvrant[$depth]) ? $ouvrant[$depth] : ' '; $ouvrant[$depth] = ' ' . $t;
// espace initial signifie: deja integree au resultat }
if ($t[0] != ' ') $t = $contenu[$depth];
{ // n'indenter que s'il y a un separateur avant
$res .= '<' . $t . '>'; $phraseur_xml->res .= ereg_replace("[\n\t ]+$", "\n$depth", $t);
$ouvrant[$depth] = ' ' . $t; $contenu[$depth] = "";
} $att = '';
$t = $contenu[$depth]; $sep = ' ';
// n'indenter que s'il y a un separateur avant foreach ($attrs as $k => $v) {
$res .= ereg_replace("[\n\t ]+$", "\n$depth", $t); $delim = strpos($v, "'") === false ? "'" : '"';
$contenu[$depth] = ""; $val = entites_html($v);
$att = ''; $att .= $sep . $k . "=" . $delim
$sep = ' '; . ($delim !== '"' ? str_replace('&quot;', '"', $val) : $val)
foreach ($attrs as $k => $v) { . $delim;
if ($phraseur_xml->attributs) $sep = "\n $depth";
validerAttribut($parser, $k, $v, $name); }
$delim = strpos($v, "'") === false ? "'" : '"'; $depth .= ' ';
$val = entites_html($v); $contenu[$depth] = "";
$att .= $sep . $k . "=" . $delim $ouvrant[$depth] = $name . $att;
. ($delim !== '"' ? str_replace('&quot;', '"', $val) : $val) $reperes[$depth] = xml_get_current_line_number($parser);
. $delim;
$sep = "\n $depth";
}
$depth .= ' ';
$contenu[$depth] = "";
$ouvrant[$depth] = $name . $att;
$reperes[$depth] = xml_get_current_line_number($parser);
} }
// http://doc.spip.org/@finElement // http://doc.spip.org/@finElement
function finElement($parser, $name) function xml_finElement($parser, $name, $fusion_bal=false)
{ {
global $phraseur_xml; global $phraseur_xml;
$depth = &$phraseur_xml->depth; $depth = &$phraseur_xml->depth;
$contenu = &$phraseur_xml->contenu; $contenu = &$phraseur_xml->contenu;
$ouvrant = &$phraseur_xml->ouvrant; $ouvrant = &$phraseur_xml->ouvrant;
$res = &$phraseur_xml->res;
$ouv = $ouvrant[$depth];
$ouv = $ouvrant[$depth]; if ($ouv[0] != ' ')
if ($ouv[0] != ' ') $ouvrant[$depth] = ' ' . $ouv;
$ouvrant[$depth] = ' ' . $ouv; else $ouv= "";
else $ouv= ""; $t = $contenu[$depth];
$t = $contenu[$depth]; $depth = substr($depth, 2);
$depth = substr($depth, 2); $t = ereg_replace("[\n\t ]+$", "\n" . $depth, $t);
$t = ereg_replace("[\n\t ]+$", "\n" . $depth, $t);
// fusion <balise></balise> en <balise />. // fusion <balise></balise> en <balise />.
// ATTENTION, en presence d'attributs ne le faire que si la DTD le dit: // ATTENTION, certains clients http croient que fusion ==> pas d'atttributs
// pour les autres, certains clients http croient que fusion ==> pas d'att
// en particulier pour les balises Script et A. // en particulier pour les balises Script et A.
if ($t || (($ouv !=$name) AND $phraseur_xml->elements[$name][0] != 'EMPTY')) // en presence d'attributs ne le faire que si la DTD est dispo et d'accord
$res .= ($ouv ? ('<' . $ouv . '>') : '') . $t . "</" . $name . ">"; // (param fusion_bal)
else
$res .= ($ouv ? ('<' . $ouv . ' />') : ("</" . $name . ">")); if ($t || (($ouv != $name) AND !$fusion_bal))
$phraseur_xml->res .= ($ouv ? ('<' . $ouv . '>') : '') . $t . "</" . $name . ">";
else
$phraseur_xml->res .= ($ouv ? ('<' . $ouv . ' />') : ("</" . $name . ">"));
} }
// http://doc.spip.org/@textElement // http://doc.spip.org/@textElement
function textElement($parser, $data) function xml_textElement($parser, $data)
{ {
global $phraseur_xml; global $phraseur_xml;
$depth = &$phraseur_xml->depth;
$contenu = &$phraseur_xml->contenu; $depth = &$phraseur_xml->depth;
$contenu[$depth] .= preg_match('/^script/',$phraseur_xml->ouvrant[$depth]) $contenu = &$phraseur_xml->contenu;
? $data $contenu[$depth] .= preg_match('/^script/',$phraseur_xml->ouvrant[$depth])
: entites_html($data); ? $data
: entites_html($data);
} }
// http://doc.spip.org/@PiElement // http://doc.spip.org/@PiElement
function PiElement($parser, $target, $data) function xml_PiElement($parser, $target, $data)
{ {
global $phraseur_xml, $xml_parser; global $phraseur_xml;
$depth = &$phraseur_xml->depth; $depth = &$phraseur_xml->depth;
$contenu = &$phraseur_xml->contenu; $contenu = &$phraseur_xml->contenu;
if (strtolower($target) != "php") if (strtolower($target) != "php")
$contenu[$depth] .= $data;
else {
ob_start();
eval($data);
$data = ob_get_contents();
ob_end_clean();
$contenu[$depth] .= $data; $contenu[$depth] .= $data;
} else {
ob_start();
eval($data);
$data = ob_get_contents();
ob_end_clean();
$contenu[$depth] .= $data;
}
} }
// http://doc.spip.org/@defautElement // http://doc.spip.org/@defautElement
function defautElement($parser, $data) function xml_defautElement($parser, $data)
{ {
global $phraseur_xml; global $phraseur_xml;
$depth = &$phraseur_xml->depth; $depth = &$phraseur_xml->depth;
$contenu = &$phraseur_xml->contenu; $contenu = &$phraseur_xml->contenu;
if (!isset($contenu[$depth])) $contenu[$depth]='';
$contenu[$depth] .= $data;
}
// http://doc.spip.org/@xml_parsefile if (!isset($contenu[$depth])) $contenu[$depth]='';
function xml_parsefile($phraseur, $file) $contenu[$depth] .= $data;
{
if (!($fp = fopen($file, "r"))) {
include_spip('inc/minipres');
echo minipres("Impossible d'ouvrir le fichier XML");
exit;
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($phraseur,
str_replace('&#8217;',"'",$data), feof($fp))) {
return (sprintf("erreur XML : %s ligne %d",
xml_error_string(xml_get_error_code($phraseur)),
xml_get_current_line_number($phraseur)));
}
}
return "";
} }
// http://doc.spip.org/@xml_parsestring // http://doc.spip.org/@xml_parsestring
function xml_parsestring($phraseur, $data) function xml_parsestring($phraseur, $data)
{ {
global $phraseur_xml; global $phraseur_xml;
$phraseur_xml->contenu[$phraseur_xml->depth] =''; $phraseur_xml->contenu[$phraseur_xml->depth] ='';
if (!xml_parse($phraseur, $data, true)) { if (!xml_parse($phraseur, $data, true)) {
// ne pas commencer le message par un "<" (cf inc_sax_dist) // ne pas commencer le message par un "<" (cf inc_sax_dist)
return xml_error_string(xml_get_error_code($phraseur)) . $phraseur_xml->err = array(
xml_error_string(xml_get_error_code($phraseur)) .
coordonnees_erreur($phraseur) . '<br />' . coordonnees_erreur($phraseur) . '<br />' .
(!$phraseur_xml->depth ? '' : (!$phraseur_xml->depth ? '' :
( (
...@@ -165,49 +139,47 @@ function xml_parsestring($phraseur, $data) ...@@ -165,49 +139,47 @@ function xml_parsestring($phraseur, $data)
"</tt>" . "</tt>" .
_L(" ligne ") . _L(" ligne ") .
$phraseur_xml->reperes[$phraseur_xml->depth] . $phraseur_xml->reperes[$phraseur_xml->depth] .
'<br />' )); '<br />' )));
}
foreach ($phraseur_xml->idrefs as $idref) {
list($nom, $ligne, $col) = $idref;
if (!isset($phraseur_xml->ids[$nom]))
$phraseur_xml->err[]= " <p><b>$nom</b>"
. _L(" ID inconnu ")
. $ligne
. " "
. $col;
} }
if ($phraseur_xml->err)
return join('<br />', $phraseur_xml->err) . '<br />';
return $phraseur_xml->res;
} }
var $depth = ""; // http://doc.spip.org/@coordonnees_erreur
var $res = ""; function coordonnees_erreur($xml_parser)
var $contenu = array(); {
var $ouvrant = array(); return
var $reperes = array(); ' ' .
var $elements = array(); xml_get_current_line_number($xml_parser) .
var $peres = array(); ' ' .
var $entites = array(); xml_get_current_column_number($xml_parser);
var $attributs = array();
var $ids = array();
var $idrefs = array();
var $err = array();
} }
// http://doc.spip.org/@inc_sax_dist function inc_sax_dist($page, $apply=false)
function inc_sax_dist($page, $apply=false) { {
global $phraseur_xml, $xml_parser; global $phraseur_xml;
// init par defaut si pas fait (espace public)
if (!isset($GLOBALS['phraseur_xml'])) {
$indenter_xml = charger_fonction('indenter_xml', 'inc');
return $indenter_xml($page, $apply);
}
$xml_parser = xml_parser_create($GLOBALS['meta']['charset']); $xml_parser = xml_parser_create($GLOBALS['meta']['charset']);
xml_set_element_handler($xml_parser, xml_set_element_handler($xml_parser,
array($phraseur_xml, "debutElement"), array($phraseur_xml, "debutElement"),
array($phraseur_xml, "finElement")); array($phraseur_xml, "finElement"));
xml_set_character_data_handler($xml_parser, array($phraseur_xml, "textElement"));
xml_set_processing_instruction_handler($xml_parser, array($phraseur_xml, 'PiElement')); xml_set_character_data_handler($xml_parser,
xml_set_default_handler($xml_parser, array($phraseur_xml, "defautElement")); array($phraseur_xml, "textElement"));
xml_set_processing_instruction_handler($xml_parser,
array($phraseur_xml, 'PiElement'));
xml_set_default_handler($xml_parser,
array($phraseur_xml, "defautElement"));
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false); xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
unset($GLOBALS['xhtml_error']); unset($GLOBALS['xhtml_error']);
if ($apply) { if ($apply) {
...@@ -216,34 +188,15 @@ function inc_sax_dist($page, $apply=false) { ...@@ -216,34 +188,15 @@ function inc_sax_dist($page, $apply=false) {
$page = ob_get_contents(); $page = ob_get_contents();
ob_end_clean(); ob_end_clean();
} }
if ($GLOBALS['xml_validation']
AND $validateur = charger_fonction('validateur', 'inc', true)) { $res = $phraseur_xml->phraserTout($xml_parser, $page);
$validateur($page);
if (isset($phraseur_xml->entites['HTMLsymbol']))
$page = unicode2charset(html2unicode($page, true));
}
$res = $phraseur_xml->xml_parsestring($xml_parser, $page);
xml_parser_free($xml_parser); xml_parser_free($xml_parser);
if ($res[0] != '<') if ($res[0] == '<') return $res;
$GLOBALS['xhtml_error'] = $res;
else
$page = $res;
return $page;
}
// http://doc.spip.org/@coordonnees_erreur $GLOBALS['xhtml_error'] = $res;
function coordonnees_erreur($xml_parser) return $page;
{
return
' ' .
xml_get_current_line_number($xml_parser) .
' ' .
xml_get_current_column_number($xml_parser);
} }
$GLOBALS['phraseur_xml'] = new PhraseurXML();
// exemple d'appel en ligne de commande:
#$error = $phraseur_xml->xml_parsefile($xml_parser, $_SERVER['argv'][1]);
?> ?>
...@@ -10,21 +10,20 @@ ...@@ -10,21 +10,20 @@
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/ \***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return; if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/sax');
define('_REGEXP_DOCTYPE', define('_REGEXP_DOCTYPE',
'/^\s*(<[?][^>]*>\s*)?<!DOCTYPE\s+(\w+)\s+(\w+)\s*([^>]*)>/'); '/^\s*(<[?][^>]*>\s*)?<!DOCTYPE\s+(\w+)\s+(\w+)\s*([^>]*)>/');
function validateur($data)
// http://doc.spip.org/@inc_validateur_dist
function inc_validateur_dist($data)
{ {
global $phraseur_xml; global $phraseur_xml;
if (!preg_match(_REGEXP_DOCTYPE, $data, $r)) if (!preg_match(_REGEXP_DOCTYPE, $data, $r))
return array(); return array();
list(,,$topelement, $avail,$suite) = $r; list(,,$topelement, $avail,$suite) = $r;
if (!preg_match('/^"([^"]*)"\s*(.*)$/', $suite, $r)) if (!preg_match('/^"([^"]*)"\s*(.*)$/', $suite, $r))
...@@ -93,7 +92,7 @@ function inc_validateur_dist($data) ...@@ -93,7 +92,7 @@ function inc_validateur_dist($data)
asort($v); asort($v);
$phraseur_xml->peres[$k] = $v; $phraseur_xml->peres[$k] = $v;
} }
} }
$phraseur_xml->elements = $res; $phraseur_xml->elements = $res;
$res = array(); $res = array();
...@@ -223,4 +222,78 @@ function validerAttribut($parser, $name, $val, $bal) ...@@ -223,4 +222,78 @@ function validerAttribut($parser, $name, $val, $bal)
} }
} }
} }
class ValidateurXML {
function debutElement($phraseur, $name, $attrs)
{
validerElement($phraseur, $name, $attrs);
xml_debutElement($phraseur, $name, $attrs);
foreach ($attrs as $k => $v) {
validerAttribut($phraseur, $k, $v, $name);
}
}
function finElement($phraseur, $name)
{
global $phraseur_xml;
xml_finElement($phraseur,
$name,
$phraseur_xml->elements[$name][0] == 'EMPTY');
}
function textElement($phraseur, $data)
{ xml_textElement($phraseur, $data);}
function PiElement($phraseur, $target, $data)
{ xml_PiElement($phraseur, $target, $data);}
function defautElement($phraseur, $data)
{ xml_defautElement($phraseur, $data);}
function phraserTout($phraseur, $data)
{
validateur($data);
if (isset($this->entites['HTMLsymbol']))
$data = unicode2charset(html2unicode($data, true));
xml_parsestring($phraseur, $data);
if (!$phraseur_xml->err) {
foreach ($this->idrefs as $idref) {
list($nom, $ligne, $col) = $idref;
if (!isset($phraseur_xml->ids[$nom]))
$this->err[]= " <p><b>$nom</b>"
. _L(" ID inconnu ")
. $ligne
. " "
. $col;
}
}
return !$this->err ? $this->res : join('<br />', $this->err) . '<br />';
}
var $depth = "";
var $res = "";
var $contenu = array();
var $ouvrant = array();
var $reperes = array();
var $elements = array();
var $peres = array();
var $entites = array();
var $attributs = array();
var $ids = array();
var $idrefs = array();
var $err = array();
}
function inc_valider_xml_dist($page, $apply=false)
{
$sax = charger_fonction('sax', 'inc');
return $sax($page, $apply, $GLOBALS['phraseur_xml'] = new ValidateurXML());
}
?> ?>
...@@ -201,8 +201,11 @@ AND $l = @unserialize($l)) { ...@@ -201,8 +201,11 @@ AND $l = @unserialize($l)) {
// Trouver la fonction eventuellement surchagee et l'appeler. // Trouver la fonction eventuellement surchagee et l'appeler.
$var_f = charger_fonction($exec); $var_f = charger_fonction($exec);
if (!$GLOBALS['xml_indent'] if (!$GLOBALS['transformer_xml']
OR $GLOBALS['auteur_session']['statut']!='0minirezo') OR $GLOBALS['auteur_session']['statut']!='0minirezo')
$var_f(); $var_f();
else { include('public/debug.php'); debug_script($var_f); } else { include('public/debug.php');
$transformer_xml=charger_fonction($GLOBALS['transformer_xml'], 'inc');
debug_script($transformer_xml($var_f, true));
}
?> ?>
...@@ -474,10 +474,8 @@ function debug_dumpfile ($texte, $fonc, $type) { ...@@ -474,10 +474,8 @@ function debug_dumpfile ($texte, $fonc, $type) {
// Fonction pour l'espace de redaction, appeler par ecrire/index.php // Fonction pour l'espace de redaction, appeler par ecrire/index.php
// http://doc.spip.org/@debug_script // http://doc.spip.org/@debug_script
function debug_script ($fonc) { function debug_script ($t) {
$sax = charger_fonction($GLOBALS['xml_indent'], 'inc');
$t = $sax($fonc, true);
if (!isset($GLOBALS['xhtml_error'])) if (!isset($GLOBALS['xhtml_error']))
echo $t; echo $t;
else { else {
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter