Les derniers articles
Tidy, la solution miracle ?
Date :: 2004-08-01
Last Updated :: 2004-08-01
Introduction
Tidy est une nouvelle extension fournie
depuis PHP 5 et
écrite par John Coggeshall,
qui permet de parser, diagnostiquer et réparer des documents
HTML,
XHTML
ou encore XML.
Dans cet artcle, nous allons voir comment, grâce à la librairie Tidy, réparer un fichier totalement invalide, inaccessible,
et le transformer en un document valide XHTML strict.
Les possibilités de cette extension sont très vastes, du à ses nombreuses
options de configuration,
il serait dur, en une seul article, d'en faire un tour complet,
nous verrons donc son fonctionnement basique.
Comme les extensions SQLite et MySQLi,
Tidy peut être utilisée de manière procédurale
ou en utilisant la POO et les classes tidy
et tidyNode.
La classe tidy
Voici la description des méthodes que propose la classe tidy :
tidy :: __construct
tidy :: __construct ( )
Constructeur de la classe.
tidy :: getOpt
mixed tidy :: getOpt ( string Option )
Cette méthode récupère la valeur de l'option de configuration Option. Voici la liste complète des options de configuration.
tidy :: cleanRepair
boolean tidy :: cleanRepair ( )
Cette méthode effectue le nettoyage et la réparation de l'objet en cours selon les options définies dans les méthodes tidy :: parseString() ou tidy :: parseFile(). Si aucune option n'a été définie, les options par défaut seront utilisées.
tidy :: parseFile
boolean tidy :: parseFile ( string Filename [, mixed Options [, string Encoding [, boolean UseIncludePath ]]] )
Cette méthode ouvre, parse et analyse le fichier Filename en utilisant les options Options. Le paramètre Options peut prendre deux formes différentes, une chaine (string) représentant le chemin vers un fichier de configuration ou un tableau (array) définissant directement ces paramètres. Si Encoding est renseigné, l'encodage correspondant sera utilisé pour tout le processus.
tidy :: parseString
boolean tidy :: parseString ( string Code [, mixed Options [, string Encoding [, boolean UseIncludePath ]]] )
Cette méthode est similaire à la méthode précédente ( tidy :: parseFile ), hormis le fait que le premier paramètre doit être une chaine contenant le code (X)HTML, et non plus l'URL vers un fichier.
tidy :: repairFile
string tidy :: repairFile ( string Filename [, mixed Options [, string Encoding ]] )
Cette méthode répare le fichier Filename, en utilisant, optionnelement les options de configuration Options. Options peut être un fichier de configuration ou un tableau (array).
tidy :: repairString
string tidy :: repairFile ( string Code [, mixed Options [, string Encoding ]] )
Cette méthode est similaire à la méthode précédente ( tidy :: repairFile ), hormis le fait que le premier paramètre doit être une chaine contenant le code (X)HTML, et non plus l'URL vers un fichier.
tidy :: diagnose
boolean tidy :: diagnose( )
Cette méthode effectue le diagnostic de l'objet en cours.
ca sert à quoi ?!?
tidy :: getRelease
string tidy :: getRelease( )
Cette méthode retourne la date de publication de la librairie Tidy utilisée.
tidy :: getConfig
array tidy :: getConfig( )
Cette méthode renvoie un tableau associatif représentatif de la configuration actuelle de Tidy
tidy :: getStatus
integer tidy :: getStatus ( )
Cette méthode renvoie un entier (0,1 ou 2) représentatif des erreurs ou avertissements rencontrés lors du chargement et parsing du code (X)HTML.
- 0 : Aucune erreur ou avertissement n'a été rencontré
- 1 : Un ou plusieurs avertissements d'accessibilité ont été détectés
- 2 : Une ou plusieurs erreurs ont été détectées
tidy :: getHtmlVer
string tidy :: getHtmlVer ( )
Cette méthode est censée renvoyer la version HTML du document courant. Pour l'instant, elle renvoie toujours 0.
tidy :: isXhtml
boolean tidy :: isXhtml ( )
Cette méthode revoie true si le document courant est un document valide XHTML ou false dans le cas contraire. Pour le moment, cette méthode renvoie false, car elle n'est pas encore implémentée dans la librairie Tidy HTML.
tidy :: isXml
boolean tidy :: isXml ( )
Cette méthode revoie true si le document courant est un document valide XML ou false dans le cas contraire. Pour le moment, cette méthode renvoie false, car elle n'est pas encore implémentée dans la librairie Tidy HTML.
tidy :: root
object tidy :: root( )
Cette méthode renvoie un objet tidyNode représentant la racine du document courant.
tidy :: head
object tidy :: head ( )
Cette méthode renvoie un objet tidyNode représentant le contenu de la balise <head>.
tidy :: html
object tidy :: html ( )
Cette méthode renvoie un objet tidyNode représentant le contenu de la balise <html>.
tidy :: body
object tidy :: body ( )
Cette méthode renvoie un objet tidyNode représentant le contenu de la balise <body>.
Le "fichier" HTML de référence
Le fichier qui suit, que nous nommerons lefichier.html, servira pour tous les exemples suivants, il est volontairement invalide, inaccessible, et ce à de nombreux niveaux. Nous allons voir ce que Tidy peut en faire ;)
<hr>
<div style="background-color:red;color:white;">Plouf le canard</div>
<div style="background-color:red;color:yellow;">Shreck l'ogre</div>
<a href="index.php?a=1&b=2"><img src="mon_image.png"></a>
<!-- un tag vide (et un commentaire) -->
<p></p>
Réparation simple - configuration par défaut
A partir du fichier HTML de référence, nous allons générer un fichier HTML valide, en utilisant les options de configuration de Tidy par défaut.
Le code PHP
// Nouvelle instance de la classe tidy
$Tidy = new tidy();
// Chargement du fichier de référence
$Tidy -> parseFile( 'lefichier.html' );
// Nettoyage et réparation
$Tidy -> cleanRepair();
// Affichage du résultat
echo $Tidy;
?>
Résultat
Voici le résultat de la transformation.
Une structure HTML valide a été générée,
comprenant un doctype et les balises <html>, <head> et <body>.
Le mot world,
qui était entouré d'une ouverture de balise <b> et d'une fermeture de balise <u>, a également été corrigé.
Le doctype (ici 4.01 transitionnal) est choisi par Tidy en fonction du contenu parsé, par défaut un doctype 3.02 transitionnal est généré.
On notera également que le tag <p> vide a été supprimé et le & du lien <a> a été remplacé par son entité : &.
<html>
<head>
<title></title>
</head>
<body>
<p>HELLO <b>world</b></p>
<hr>
<div style="background-color:red;color:white;">Plouf le
canard</div>
<div style="background-color:red;color:yellow;">Shreck l'ogre</div>
<a href="index.php?a=1&b=2"><img src="mon_image.png"></a>
<!-- un tag vide (et un commentaire) -->
</body>
</html>
Tidy a dit
La fonction tidy_get_error_buffer() permet de localiser les erreurs que Tidy a rencontré dans votre document, pour l'exemple précédent, voici ce qu'elle a renvoyé :
line 1 column 10 - Warning: replacing unexpected u by </u>
line 6 column 23 - Warning: unescaped & or unknown entity "&b"
line 1 column 1 - Warning: inserting missing 'title' element
line 6 column 29 - Warning: <img> lacks "alt" attribute
line 8 column 1 - Warning: trimming empty <p>
Améliorons notre fichier
Malgré que Tidy a déjà bien travaillé sur notre fichier HTML de départ,
nous pouvons encore améliorer les choses ...
Nous allons nettoyer le fichier, supprimer les styles à l'intérieur du fichier (inline) pour les remplacer par des classes
CSS et
supprimer les commentaires (<!-- -->).
Le code PHP
// Nouvelle instance de la classe tidy
$Tidy = new tidy();
// Définition des options
$Options = array (
'clean' => true,
'hide-comments' => true
);
// Chargement du fichier de référence avec les options
$Tidy -> parseFile( 'lefichier.html' , $Options );
// Nettoyage et réparation
$Tidy -> cleanRepair();
// Affichage du résultat
echo $Tidy;
?>
Résultat
Voilà le résultat, nos styles ont bien été déplacés dans le <head> du document, et le commentaire a été supprimé :
<html>
<head>
<title></title>
<style type="text/css">
div.c2 {background-color:red;color:yellow;}
div.c1 {background-color:red;color:white;}
</style>
</head>
<body>
<p>HELLO <b>world</b></p>
<hr>
<div class="c1">Plouf le canard</div>
<div class="c2">Shreck l'ogre</div>
<a href="index.php?a=1&b=2"><img src="mon_image.png"></a>
</body>
</html>
Un fichier valide XHTML strict
Nous allons maintenant transformer notre fichier de départ en un fichier valide XHTML strict, en utilisant les options suivantes :
Les options de configuration utilisées
- output-xhtml :: Force la sortie en XHTML
- clean :: Nettoie le fichier
- indent :: Indente le code de sortie
- indent-spaces :: Applique une indentation de 4 espaces (valeur par défaut : 2)
- alt-text :: Définie un attribut alt="" par défaut pour les images n'en contenant pas
- logical-emphasis :: Remplace les balises <i> par <em> et <b> par <strong>
- accessibility-check :: Fixe le niveau d'accessibilité au maximum (valeur par défaut : 0)
- enclose-block-text :: Encadre les texte/image dans un bloc <p> si ils ne sont pas déjà préalablement encadrés
- hide-comments :: Supprime les commentaires
- doctype :: Fixe le type de doctype (transitionnal, strict, loose, ...)
- wrap :: Applique un retour à la ligne tous les X caractères
Voici la liste complète des options de configuration de la librairie Tidy.
Code PHP
Nous transmettrons donc toutes les options de confuguration passées en revue précédemment, dans un tableau de paramètres à la méthode tidy :: parseFile().
// Nouvelle instance de la classe tidy
$Tidy = new tidy();
// Définition des options
$Options = array (
'output-xhtml' => true,
'clean' => true,
'indent' => true,
'indent-spaces' => 4,
'alt-text' => 'Mon image',
'logical-emphasis' => true,
'accessibility-check' => 3,
'enclose-block-text' => true,
'hide-comments' => true,
'doctype' => 'strict',
'wrap' => 100
);
// Chargement du fichier de référence avec les options
$Tidy -> parseFile( 'lefichier.html' , $Options );
// Nettoyage et réparation
$Tidy -> cleanRepair();
// Affichage du résultat
echo $Tidy;
?>
Résultat
Un fichier valide XHTML strict a bien été généré à partir de notre "misérable" bout de code de départ.
Les balises sans tag de fermeture, comme <img> ou <hr> ont été refermées pour être conformes aux
spécifications XHTML.
Le contenu de la balise <style> a été placé à l'intérieur d'un CDATA, comme spécifié
ici.
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<style type="text/css">
/*<![CDATA[*/
div.c2 {background-color:red;color:yellow;}
div.c1 {background-color:red;color:white;}
/*]]>*/
</style>
</head>
<body>
<p>
HELLO <strong>world</strong>
</p>
<hr />
<div class="c1">
Plouf le canard
</div>
<div class="c2">
Shreck l'ogre
</div>
<p>
<a href="index.php?a=1&b=2"><img src="mon_image.png" alt="Mon image" /></a>
</p>
</body>
</html>
Conclusion
Alors, l'extension Tidy est elle la solution miracle à vos problèmes de code HTML ? Mon avis est partagé, elle peut en effet rendre pas mal de services assez sympathiques, néanmoins certaines fonctionnailtés semblent être manquantes ou simplement ne pas rendre le service attendu :
- Les paramètres output-file et error-file sont inactifs
- Impossible de remplacer les balises <font> par les styles CSS correspondants
- Les balises <u> ne sont pas remplacées par un style CSS correspondant
Liens utiles
- PHP - L'extension Tidy
- La librairie Tidy HTML
- Les options de configuration de Tidy
- Site de l'auteur de l'extension + exemples
- Article chez Zend
Fabrice Lezoray < fabrice AT scriptsphp.org >.
Trackback
Il n'y a pas de trackback recensé pour cet article.
Faire un trackback sur cet article http://classes.scriptsphp.org/Trackbackserver.Tidy-la-solution-miracle, récupérer les trackback sur cet article