[ Index ] |
|
Code source de SPIP 1.8.3 |
1 <?php 2 3 /***************************************************************************\ 4 * SPIP, Systeme de publication pour l'internet * 5 * * 6 * Copyright (c) 2001-2005 * 7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * 8 * * 9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * 10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * 11 \***************************************************************************/ 12 13 14 // 15 // Ce fichier ne sera execute qu'une fois 16 if (defined("_ECRIRE_INC_TIDY")) return; 17 define("_ECRIRE_INC_TIDY", "1"); 18 19 20 function version_tidy() { 21 static $version = -1; 22 if ($version == -1) { 23 $version = 0; 24 if (function_exists('tidy_parse_string')) { 25 $version = 1; 26 if (function_exists('tidy_get_body')) { 27 $version = 2; 28 } 29 } 30 } 31 return $version; 32 } 33 34 35 function echappe_xhtml ($letexte) { // oui, c'est dingue... on echappe le mathml 36 $regexp_echap_math = "/<(math|textarea)((.*?))<\/$1>/si"; 37 $source = "xhtml"; 38 39 if (preg_match_all($regexp_echap_math, $letexte, $regs, PREG_SET_ORDER)) 40 foreach ($regs as $reg) { 41 $num_echap++; 42 $les_echap[$num_echap] = $reg[0]; 43 $letexte = str_replace($reg[0],"@@SPIP_$source$num_echap@@", $letexte); 44 } 45 46 return array($letexte, $les_echap); 47 } 48 49 50 function xhtml($buffer) { 51 $buffer = traite_xhtml($buffer); 52 53 /** ici commence la petite usine a gaz des traitements d'erreurs de tidy **/ 54 ## NB: seul tidy en ligne de commande sait gerer ses erreurs, 55 56 // Conserver une liste des URLs en erreur tidy 57 lire_fichier($f = _DIR_SESSIONS.'w3c-go-home.txt', $liste); 58 $url = "http://".$_SERVER['HTTP_HOST'].nettoyer_uri(); 59 60 if (defined('_erreur_tidy')) { 61 62 if (defined('_calcul_tidy')) { 63 spip_log("Erreur tidy : $url\n"._erreur_tidy, 'tidy'); 64 if (strpos($liste, "- $url -\n") === false) { 65 $liste = substr($liste, - 8*1024); # anti-explosions 66 ecrire_fichier($f, $liste."- $url -\n"); 67 } 68 } 69 70 $GLOBALS['xhtml_error'] = _erreur_tidy; 71 72 // Na, na na nere, tidy a plante ! 73 header("X-SPIP-Message: tidy/W3C could not repair this page"); 74 75 } 76 else # pas d'erreur 77 { 78 // Nettoyer la liste des URLs pourries, si maintenant on est correct 79 if (defined('_calcul_tidy')) { 80 if (($liste2 = str_replace("- $url -\n", '', $liste)) != $liste) 81 ecrire_fichier($f, $liste2); 82 } 83 84 // Faire la pub parce qu'on est content 85 header("X-SPIP-Message: tidy/W3C has verified this page"); 86 87 # tres perilleux, et totalement inutile a ce stade (mais fonctionnel si on veut) 88 # if (defined('_TIDY_COMMAND')) 89 # entetes_xhtml(); 90 91 } 92 // Ajouter un bouton d'admin "Analyser" 93 $GLOBALS['xhtml_check'] = 'http://validator.w3.org/check?uri=' 94 . urlencode("http://" . $_SERVER['HTTP_HOST'] . nettoyer_uri()); 95 /** fin de l'usine a gaz **/ 96 97 98 return $buffer; 99 } 100 101 function traite_xhtml ($buffer) { 102 103 // Seuls les charsets iso-latin et utf-8 sont concernes 104 $charset = lire_meta('charset'); 105 if ($charset == "iso-8859-1") 106 $enc_char = "latin1"; 107 else if ($charset == "utf-8") 108 $enc_char = "utf8"; 109 else { 110 spip_log("erreur inc_tidy : charset=$charset", 'tidy'); 111 return $buffer; 112 } 113 114 if (defined('_TIDY_COMMAND')) { 115 // Si l'on a defini un chemin pour tidyHTML 116 // en ligne de commande 117 // (pour les sites qui n'ont pas tidyPHP) 118 119 list($buffer, $les_echap) = echappe_xhtml($buffer); # math et textarea 120 121 $cache = _DIR_CACHE.creer_repertoire(_DIR_CACHE,'tidy'); 122 $nomfich = $cache.'tidy'.md5($buffer); 123 if (!file_exists($nomfich)) { 124 define ('_calcul_tidy', 1); 125 $tmp = "$nomfich.".@getmypid().".tmp"; 126 ecrire_fichier($tmp, $buffer, true); # ecrire meme en mode preview 127 128 // Experimental : on peut definir ses propres options tidy 129 if (!defined('_TIDY_OPTIONS')) 130 $options = "--output-xhtml true"; # a.k.a. -asxhtml 131 else 132 $options = _TIDY_OPTIONS; 133 134 $c = _TIDY_COMMAND 135 ." --tidy-mark false" 136 ." --quote-nbsp false" 137 ." --show-body-only false" 138 ." --indent true" 139 ." --wrap false" 140 ." --add-xml-decl false" 141 ." --char-encoding $enc_char" 142 ." ".$options 143 ." -m $tmp" 144 ." 2>&1"; 145 spip_log(nettoyer_uri(), 'tidy'); 146 spip_timer('tidy'); 147 exec($c, $verbose, $exit_code); 148 spip_log ($c.' ('.spip_timer('tidy').')', 'tidy'); 149 if ($exit_code == 2) { 150 define ('_erreur_tidy', join("\n", $verbose)); 151 # un fichier .err accompagne le cache, qu'on s'en souvienne 152 # au prochain hit (gestion d'erreur) 153 spip_touch("$nomfich.err"); 154 } else { 155 @unlink("$nomfich.err"); 156 } 157 158 rename($tmp,$nomfich); 159 } 160 161 if (lire_fichier($nomfich, $tidy) 162 AND strlen(trim($tidy)) > 0) { 163 // purger le petit cache toutes les 5 minutes (300s) 164 spip_touch($nomfich); # rester vivant 165 if (spip_touch($cache.'purger_tidy', 300, true)) { 166 if ($h = @opendir($cache)) { 167 while (($f = readdir($h)) !== false) { 168 if (preg_match(',^tidy[^.]*$,', $f) 169 AND time() - filemtime("$cache$f") > 300) { 170 @unlink("$cache$f"); 171 @unlink("$cache$f.err"); 172 } 173 } 174 } 175 } 176 177 $tidy = preg_replace (",<[?]xml.*>,U", "", $tidy); 178 if (@file_exists("$nomfich.err")) { 179 define ('_erreur_tidy', 1); 180 } 181 return $tidy; 182 } else { 183 define ('_erreur_tidy', 1); 184 return $buffer; 185 } 186 } 187 188 ### tout ce qui suit est non teste, et probablement non fonctionnel 189 else if (version_tidy() == "1") { 190 include_ecrire ("inc_texte.php3"); 191 192 list($buffer, $les_echap) = echappe_xhtml($buffer); # math et textarea 193 194 tidy_set_encoding ($enc_char); 195 tidy_setopt('wrap', 0); 196 tidy_setopt('indent-spaces', 4); 197 tidy_setopt('output-xhtml', true); 198 tidy_setopt('add-xml-decl', false); 199 tidy_setopt('indent', 5); 200 tidy_setopt('show-body-only', false); 201 tidy_setopt('quote-nbsp', false); 202 203 tidy_parse_string($buffer); 204 tidy_clean_repair(); 205 $tidy = tidy_get_output(); 206 207 if ($les_echap) { 208 include_ecrire ("inc_texte.php3"); 209 $tidy = echappe_retour($tidy, $les_echap, "xhtml"); 210 } 211 212 // En Latin1, tidy ajoute une declaration XML 213 // (malgre add-xml-decl a false) ; il faut le supprimer 214 // pour eviter interpretation PHP provoquant une erreur 215 $tidy = ereg_replace ("\<\?xml([^\>]*)\>", "", $tidy); 216 # pas de gestion d'erreur ? 217 return $tidy; 218 } 219 else if (version_tidy() == "2") { 220 include_ecrire ("inc_texte.php3"); 221 222 list($buffer, $les_echap) = echappe_xhtml($buffer); # math et textarea 223 224 $config = array( 225 'wrap' => 0, 226 'indent-spaces' => 4, 227 'output-xhtml' => true, 228 'add-xml-decl' => false, 229 'indent' => 0, 230 'show-body-only' => false, 231 'quote-nbsp' => false 232 ); 233 $tidy = tidy_parse_string($buffer, $config, $enc_char); 234 tidy_clean_repair($tidy); 235 236 if ($les_echap) { 237 include_ecrire ("inc_texte.php3"); 238 $tidy = echappe_retour($tidy, $les_echap, "xhtml"); 239 } 240 241 $tidy = ereg_replace ("\<\?xml([^\>]*)\>", "", $tidy); 242 # pas de gestion d'erreur ? 243 return $tidy; 244 } 245 else { 246 define ('_erreur_tidy', 1); 247 return $buffer; 248 } 249 } 250 251 ## desactive pour le moment... complications dans tous les sens et gros risque d'erreur 252 function entetes_xhtml() { 253 // Si Mozilla et tidy actif, passer en "application/xhtml+xml" 254 // extremement risque: Mozilla passe en mode debugueur strict 255 // mais permet d'afficher du MathML directement dans le texte 256 // (et sauf erreur, c'est la bonne facon de declarer du xhtml) 257 if (strpos($_SERVER['HTTP_ACCEPT'], "application/xhtml+xml")) { 258 @header("Content-Type: application/xhtml+xml; charset=".lire_meta('charset')); 259 } else { 260 @header("Content-Type: text/html; charset=".lire_meta('charset')); 261 echo '<'.'?xml version="1.0" encoding="'. lire_meta('charset').'"?'.">\n"; 262 } 263 } 264 265 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Thu Feb 22 22:27:47 2007 | par Balluche grâce à PHPXref 0.7 |