Tidy, ton extension est formidable
Par Yves Tannier le mardi, juillet 5 2005, 10:16 - Le PHP - Lien permanent
Je suis plus que ravi d'avoir découvert cet outils qui permet de corriger les petites erreurs de syntaxe XHTML, d'indenter correctement le code, de supprimer les commentaires HTML, de nettoyer du code Word 2002 (enfin presque) ect... Ce n'est pas non plus une solution miracle (non, Tidy ne fait pas la café) et rien n'y fera si vous avez vraiment codé comme un vilain avec un M$ Frontpage d'avant-guerre.
Ainsi, et tout de même, tout un site de publication de contenu peut vite devenir "Full XHTML compliant" même si le code n'était pas des plus parfait au départ ou suite à la saisie fantaisiste de quelques rédacteurs zélés.
Cerise sur le W3C, SPIP, mon CMS préféré du moment, intègre dans sa version 1.8 la correction des pages via cette fameuse extension Tidy. On peux l'utiliser au choix en extension PHP ou en ligne de commande (puisque l'outil en question est à la base un correcteur syntaxique en ligne de commande).
Je vous laisse admirer sur le site spatial-modelling.info qui tourne sous SPIP, le maaaagnifique code source bien indenté par la version de Tidy en ligne de commande. Est-ce lent ? Absolument pas car pour le cas de ce système de gestion de contenu, la sortie est ensuite directement mise en cache !
Alors, la question vous brûle les lèvres : pour une utilisation de Tidy sur son propre site en PHP, comment faire ? Attention, c'est du tutorial ultra rapide qui ne remplace pas une bonne lecture de la page de PHP et des options de Tidy.
Il faut tout d'abord posséder l'extension PHP qui va bien ou l'outil en ligne de commande (apt-get install tidy sous Debian ou Ubuntu fera l'affaire). Pour le cas de l'extension, elle disponible pour PHP5 mais reste un petit peu bricolage pour PHP4 et j'ai. Une installation via le PEAR repository est aussi envisageable. je vous renvois à la page du manuel PHP, assez bien faîtes à ce sujet.
Ensuite, si vous n'avez pas le courage de modifier toutes vos pages proprement codé en PHP ou en HTML, voici un petit truc dont le but est de placer tout le contenu de votre page dans un "buffer".
En début de page on place un ob_start pour mettre le contenu qui suit dans un buffer. On peux éventuellement utiliser l'option gzip tant qu'on y est, afin de renvoyer des pages compressées à un navigateur moderne (ne comptez pas sur vos clients en Netscape 4 pour le comprendre). A la fin du code, un ob_get_clean nous permet de récupérer le contenu du buffer dans une variable. Il suffit ensuite de passer tout ça à Tidy pour qui il nous le corrige et un echo servira le résultat et... Ohhh la belle page qui valide 
Voici donc un petit résumé de l'exemple :
J'ai mis tout le "nécessaire de nettoyage" dans une fonction. Des problèmes avec les caractères Word m'ont obligés à ajouter le remplacement des caractères en question. J'ai également supprimé un élément xml ajouté par Tidy et dont je ne voit pas bien l'utilité :
<?php
// Tidy configuration
$config_tidy = array('indent'=> true,
'indent-spaces'=> 2,
'output-xhtml' => true,
'wrap' => 0,
'add-xml-decl'=> false,
'output-encoding'=> latin1,
'input-encoding'=> latin1,
'quote-nbsp' => false,
'show-body-only' => false);
foreach ($config_tidy as $key => $value) {
tidy_setopt($key,$value);
}
// nettoyage du code
function tidycleaner($html) {
// problème avec M$ Word
$conv = array(
chr(129) => '',
chr(130) => '‚',
chr(131) => 'ƒ',
chr(132) => '„',
chr(133) => '…',
chr(134) => '†',
chr(135) => '‡',
chr(136) => 'ˆ',
chr(137) => '‰',
chr(138) => 'Š',
chr(139) => '‹',
chr(140) => 'Œ',
chr(141) => '',
chr(142) => '',
chr(143) => '',
chr(144) => '',
chr(145) => '‘',
chr(146) => '’',
chr(147) => '“',
chr(148) => '”',
chr(149) => '•',
chr(150) => '–',
chr(151) => '—',
chr(152) => '˜',
chr(153) => '™',
chr(154) => 'š',
chr(155) => '›',
chr(156) => 'œ',
chr(157) => '',
chr(158) => '',
chr(159) => 'Ÿ'
);
tidy_parse_string($html);
tidy_clean_repair();
$html = tidy_get_output();
// on remplace les caracteres M$ Word
$html = str_replace(array_keys($conv),array_values($conv),$html);
// syntaxe xml à supprimer
$html = ereg_replace ("\<\?xml([^\>]*)\>", "", $html);
return $html;
}
?>
Voici une page type avec l'introduction de la fonction tidycleaner :
<?php
// debut du buffer
ob_start(gzip);
// ...
// contenu de la page, traitement divers et tout le toutim...
// ...
// fin du buffer, dans une variable et ensuite affichage de la page
$html = ob_get_clean();
echo tidycleaner($html);
?>
<?php echo 'test'; ?>
Pour éviter la lourdeur éventuel du traitement par Tidy, il est bien entendu fortement conseillé d'utiliser un système de cache ! Alors ? ça valide partout !?
