Skip to content
Extraits de code Groupes Projets
Valider edacf422 rédigé par Fil's avatar Fil
Parcourir les fichiers

Gestion integree de 'tidy' (en ligne de commande)

Les pages qui ne passent pas le nettoyage sont notées dans ecrire/data/
les autres sont envoyées avec un entete sympa
parent add8bc37
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -63,7 +63,61 @@ function echappe_xhtml ($letexte) { // oui, c'est dingue... on echappe le mathml ...@@ -63,7 +63,61 @@ function echappe_xhtml ($letexte) { // oui, c'est dingue... on echappe le mathml
return array($letexte, $les_echap); 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 // Seuls les charsets iso-latin et utf-8 sont concernes
$charset = lire_meta('charset'); $charset = lire_meta('charset');
...@@ -80,7 +134,6 @@ function xhtml ($buffer) { ...@@ -80,7 +134,6 @@ function xhtml ($buffer) {
// Si l'on a defini un chemin pour tidyHTML // Si l'on a defini un chemin pour tidyHTML
// en ligne de commande // en ligne de commande
// (pour les sites qui n'ont pas tidyPHP) // (pour les sites qui n'ont pas tidyPHP)
include_ecrire("inc_texte.php3"); include_ecrire("inc_texte.php3");
$retour_echap = echappe_xhtml ($buffer); $retour_echap = echappe_xhtml ($buffer);
...@@ -90,6 +143,7 @@ function xhtml ($buffer) { ...@@ -90,6 +143,7 @@ function xhtml ($buffer) {
$cache = _DIR_CACHE.creer_repertoire(_DIR_CACHE,'tidy'); $cache = _DIR_CACHE.creer_repertoire(_DIR_CACHE,'tidy');
$nomfich = $cache.'tidy'.md5($buffer); $nomfich = $cache.'tidy'.md5($buffer);
if (!file_exists($nomfich)) { if (!file_exists($nomfich)) {
define ('_calcul_tidy', 1);
$tmp = "$nomfich.".@getmypid().".tmp"; $tmp = "$nomfich.".@getmypid().".tmp";
ecrire_fichier($tmp, $buffer); ecrire_fichier($tmp, $buffer);
...@@ -109,8 +163,14 @@ function xhtml ($buffer) { ...@@ -109,8 +163,14 @@ function xhtml ($buffer) {
exec($c, $verbose, $exit_code); exec($c, $verbose, $exit_code);
spip_log ($c.' ('.spip_timer('tidy').')', 'tidy'); spip_log ($c.' ('.spip_timer('tidy').')', 'tidy');
if ($exit_code == 2) { 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); rename($tmp,$nomfich);
} }
...@@ -121,22 +181,28 @@ function xhtml ($buffer) { ...@@ -121,22 +181,28 @@ function xhtml ($buffer) {
if (spip_touch($cache.'purger_tidy', 300, true)) { if (spip_touch($cache.'purger_tidy', 300, true)) {
if ($h = @opendir($cache)) { if ($h = @opendir($cache)) {
while (($f = readdir($h)) !== false) { while (($f = readdir($h)) !== false) {
if (substr($f, 0, 4) == 'tidy' if (preg_match(',^tidy[^.]*$,', $f)
AND time() - filemtime("$cache$f") > 300) { AND time() - filemtime("$cache$f") > 300) {
@unlink("$cache$f"); @unlink("$cache$f");
@unlink("$cache$f.err");
} }
} }
} }
} }
$tidy = echappe_retour($tidy, $les_echap, "xhtml"); $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; return $tidy;
} else { } else {
define ('_erreur_tidy', 1); define ('_erreur_tidy', 1);
return $buffer; return $buffer;
} }
} }
### tout ce qui suit est non teste, et probablement non fonctionnel
else if (version_tidy() == "1") { else if (version_tidy() == "1") {
include_ecrire("inc_texte.php3"); include_ecrire("inc_texte.php3");
...@@ -161,6 +227,7 @@ function xhtml ($buffer) { ...@@ -161,6 +227,7 @@ function xhtml ($buffer) {
// (malgre add-xml-decl a false) ; il faut le supprimer // (malgre add-xml-decl a false) ; il faut le supprimer
// pour eviter interpretation PHP provoquant une erreur // pour eviter interpretation PHP provoquant une erreur
$tidy = ereg_replace ("\<\?xml([^\>]*)\>", "", $tidy); $tidy = ereg_replace ("\<\?xml([^\>]*)\>", "", $tidy);
# pas de gestion d'erreur ?
return $tidy; return $tidy;
} }
else if (version_tidy() == "2") { else if (version_tidy() == "2") {
...@@ -182,6 +249,7 @@ function xhtml ($buffer) { ...@@ -182,6 +249,7 @@ function xhtml ($buffer) {
$tidy = tidy_parse_string($buffer, $config, $enc_char); $tidy = tidy_parse_string($buffer, $config, $enc_char);
tidy_clean_repair($tidy); tidy_clean_repair($tidy);
$tidy = ereg_replace ("\<\?xml([^\>]*)\>", "", $tidy); $tidy = ereg_replace ("\<\?xml([^\>]*)\>", "", $tidy);
# pas de gestion d'erreur ?
return $tidy; return $tidy;
} }
else { else {
...@@ -190,20 +258,17 @@ function xhtml ($buffer) { ...@@ -190,20 +258,17 @@ function xhtml ($buffer) {
} }
} }
## desactive pour le moment... complications dans tous les sens et gros risque d'erreur
function entetes_xhtml() { function entetes_xhtml() {
// Si Mozilla et tidy actif, passer en "application/xhtml+xml" // Si Mozilla et tidy actif, passer en "application/xhtml+xml"
// extremement risque: Mozilla passe en mode debugueur strict // extremement risque: Mozilla passe en mode debugueur strict
// mais permet d'afficher du MathML directement dans le texte // mais permet d'afficher du MathML directement dans le texte
// (et sauf erreur, c'est la bonne facon de declarer du xhtml) // (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")) {
if (strpos($_SERVER['HTTP_ACCEPT'], "application/xhtml+xml")) { @header("Content-Type: application/xhtml+xml; charset=".lire_meta('charset'));
@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";
}
} else { } else {
@header("Content-Type: text/html; charset=".lire_meta('charset')); @header("Content-Type: text/html; charset=".lire_meta('charset'));
echo '<'.'?xml version="1.0" encoding="'. lire_meta('charset').'"?'.">\n";
} }
} }
......
...@@ -115,12 +115,9 @@ function calcule_header_et_page ($fond, $delais) { ...@@ -115,12 +115,9 @@ function calcule_header_et_page ($fond, $delais) {
} }
} }
// Content-type: xml ou html ; charset // Content-type: par defaut html+charset (poss surcharge par la suite)
if ($GLOBALS['xhtml'] AND !defined('_erreur_tidy') AND !$flag_preserver) { if (!headers_sent())
include_ecrire("inc_tidy.php"); header("Content-Type: text/html; charset=".lire_meta('charset'));
entetes_xhtml(); # attention, elle peut demarrer le contenu
} else
@header("Content-Type: text/html; charset=".lire_meta('charset'));
return $page; return $page;
} }
......
...@@ -93,7 +93,7 @@ if (defined("_INC_PUBLIC")) { ...@@ -93,7 +93,7 @@ if (defined("_INC_PUBLIC")) {
} }
// Appliquer tidy au besoin // 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'); include_ecrire('inc_tidy.php');
$page = xhtml($page); $page = xhtml($page);
} }
......
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