diff --git a/ecrire/inc_tidy.php b/ecrire/inc_tidy.php index 2a5ffc27e65570135e9e62d755da3f5bfa4bfdab..5b08c87a47e564c66cf563c12fd2a4c0031d907e 100644 --- a/ecrire/inc_tidy.php +++ b/ecrire/inc_tidy.php @@ -63,7 +63,61 @@ function echappe_xhtml ($letexte) { // oui, c'est dingue... on echappe le mathml return array($letexte, $les_echap); } -function xhtml ($buffer) { + +function xhtml($buffer) { + $buffer = traite_xhtml($buffer); + +/** ici commence la petite usine a gaz des traitements d'erreurs de tidy **/ + ## NB: seul tidy en ligne de commande sait gerer ses erreurs, + if (defined('_erreur_tidy')) { + $url = "http://".$_SERVER['HTTP_HOST'].nettoyer_uri(); + if (defined('_calcul_tidy')) { + spip_log("Erreur tidy : $url\n"._erreur_tidy, 'tidy'); + + // Conserver une liste des URLs en erreur tidy + lire_fichier($f = _DIR_SESSIONS.'w3c-go-home.txt', $liste); + if (strpos($liste, "- $url -\n") === false) { + $liste = substr($liste, - 8*1024); # anti-explosions + ecrire_fichier($f, $liste."- $url -\n"); + } + } + + // Ajouter un pseudo bouton d'admin + if ($GLOBALS['affiche_boutons_admin']) { + $buffer = preg_replace(',<div class="spip-admin-bloc" dir=\'(ltr|rtl)\'>\s*<ul>,ms', + '$0<li><a href="http://validator.w3.org/check?uri='.stripslashes(preg_quote(entites_html($url))).'" class=\'spip-admin-boutons\'>Erreur tidy !</a></li>', $buffer); + } + + // Na, na na nere, tidy a plante ! + header("X-SPIP-Message: tidy/W3C could not repair this page"); + + } + else # pas d'erreur + { + // Nettoyer la liste des URLs pourries, si maintenant on est correct + if (defined('_calcul_tidy')) { + lire_fichier($f = _DIR_SESSIONS.'w3c-go-home.txt', $liste); + $url = "- http://".$_SERVER['HTTP_HOST'].nettoyer_uri()." -\n"; + if (($liste2 = str_replace($url, '', $liste)) != $liste) + ecrire_fichier($f, $liste2); + } + + // Faire la pub parce qu'on est content + header("X-SPIP-Message: tidy/W3C has verified this page"); + +# tres perilleux, et totalement inutile a ce stade (mais fonctionnel si on veut) +# if (defined('_TIDY_COMMAND')) +# entetes_xhtml(); + + } + +/** fin de l'usine a gaz **/ + + + return $buffer; +} + +function traite_xhtml ($buffer) { // Seuls les charsets iso-latin et utf-8 sont concernes $charset = lire_meta('charset'); @@ -80,7 +134,6 @@ function xhtml ($buffer) { // Si l'on a defini un chemin pour tidyHTML // en ligne de commande // (pour les sites qui n'ont pas tidyPHP) - include_ecrire("inc_texte.php3"); $retour_echap = echappe_xhtml ($buffer); @@ -90,6 +143,7 @@ function xhtml ($buffer) { $cache = _DIR_CACHE.creer_repertoire(_DIR_CACHE,'tidy'); $nomfich = $cache.'tidy'.md5($buffer); if (!file_exists($nomfich)) { + define ('_calcul_tidy', 1); $tmp = "$nomfich.".@getmypid().".tmp"; ecrire_fichier($tmp, $buffer); @@ -109,8 +163,14 @@ function xhtml ($buffer) { exec($c, $verbose, $exit_code); spip_log ($c.' ('.spip_timer('tidy').')', 'tidy'); if ($exit_code == 2) { - spip_log("Erreur tidy :\n".join("\n", $verbose), 'tidy'); + define ('_erreur_tidy', join("\n", $verbose)); + # un fichier .err accompagne le cache, qu'on s'en souvienne + # au prochain hit (gestion d'erreur) + spip_touch("$nomfich.err"); + } else { + @unlink("$nomfich.err"); } + rename($tmp,$nomfich); } @@ -121,22 +181,28 @@ function xhtml ($buffer) { if (spip_touch($cache.'purger_tidy', 300, true)) { if ($h = @opendir($cache)) { while (($f = readdir($h)) !== false) { - if (substr($f, 0, 4) == 'tidy' + if (preg_match(',^tidy[^.]*$,', $f) AND time() - filemtime("$cache$f") > 300) { @unlink("$cache$f"); + @unlink("$cache$f.err"); } } } } $tidy = echappe_retour($tidy, $les_echap, "xhtml"); - $tidy = ereg_replace ("\<\?xml([^\>]*)\>", "", $tidy); + $tidy = preg_replace (",<[?]xml.*>,U", "", $tidy); + if (@file_exists("$nomfich.err")) { + define ('_erreur_tidy', 1); + } return $tidy; } else { define ('_erreur_tidy', 1); return $buffer; } } + + ### tout ce qui suit est non teste, et probablement non fonctionnel else if (version_tidy() == "1") { include_ecrire("inc_texte.php3"); @@ -161,6 +227,7 @@ function xhtml ($buffer) { // (malgre add-xml-decl a false) ; il faut le supprimer // pour eviter interpretation PHP provoquant une erreur $tidy = ereg_replace ("\<\?xml([^\>]*)\>", "", $tidy); + # pas de gestion d'erreur ? return $tidy; } else if (version_tidy() == "2") { @@ -182,6 +249,7 @@ function xhtml ($buffer) { $tidy = tidy_parse_string($buffer, $config, $enc_char); tidy_clean_repair($tidy); $tidy = ereg_replace ("\<\?xml([^\>]*)\>", "", $tidy); + # pas de gestion d'erreur ? return $tidy; } else { @@ -190,20 +258,17 @@ function xhtml ($buffer) { } } +## desactive pour le moment... complications dans tous les sens et gros risque d'erreur function entetes_xhtml() { // Si Mozilla et tidy actif, passer en "application/xhtml+xml" // extremement risque: Mozilla passe en mode debugueur strict // mais permet d'afficher du MathML directement dans le texte // (et sauf erreur, c'est la bonne facon de declarer du xhtml) - if (defined('_TIDY_COMMAND') OR (version_tidy() > 0)) { - if (strpos($_SERVER['HTTP_ACCEPT'], "application/xhtml+xml")) { - @header("Content-Type: application/xhtml+xml; charset=".lire_meta('charset')); - } else { - @header("Content-Type: text/html; charset=".lire_meta('charset')); - echo '<'.'?xml version="1.0" encoding="'. lire_meta('charset').'"?'.">\n"; - } + if (strpos($_SERVER['HTTP_ACCEPT'], "application/xhtml+xml")) { + @header("Content-Type: application/xhtml+xml; charset=".lire_meta('charset')); } else { @header("Content-Type: text/html; charset=".lire_meta('charset')); + echo '<'.'?xml version="1.0" encoding="'. lire_meta('charset').'"?'.">\n"; } } diff --git a/inc-public-global.php3 b/inc-public-global.php3 index fbfedd01b5d1cf674c9b32cb6debe401677c9424..78b1610c9317b9071ec536c109d75f85ba829a3e 100644 --- a/inc-public-global.php3 +++ b/inc-public-global.php3 @@ -115,12 +115,9 @@ function calcule_header_et_page ($fond, $delais) { } } - // Content-type: xml ou html ; charset - if ($GLOBALS['xhtml'] AND !defined('_erreur_tidy') AND !$flag_preserver) { - include_ecrire("inc_tidy.php"); - entetes_xhtml(); # attention, elle peut demarrer le contenu - } else - @header("Content-Type: text/html; charset=".lire_meta('charset')); + // Content-type: par defaut html+charset (poss surcharge par la suite) + if (!headers_sent()) + header("Content-Type: text/html; charset=".lire_meta('charset')); return $page; } diff --git a/inc-public.php3 b/inc-public.php3 index cf6a7f07fd26bec861221779fdb03bf3a081f3f6..999a1f26a825eafd373adc98d23d24c1875df67b 100644 --- a/inc-public.php3 +++ b/inc-public.php3 @@ -93,7 +93,7 @@ if (defined("_INC_PUBLIC")) { } // Appliquer tidy au besoin - if (trim($page) AND $xhtml AND !$flag_preserver) { + if (trim($page) AND $xhtml AND !$flag_preserver AND !headers_sent()) { include_ecrire('inc_tidy.php'); $page = xhtml($page); }