Tidy HTML - VertigeASBL/SPIP-Vertige GitHub Wiki
Pour les sites devant être strictement valides w3c (comme tous les sites anysurfer), on a beau créer de magnifiques squelettes qui respectent toutes les normes et standards, on est jamais à l'abri de mauvaises saisies de la part du client. Rien ne l'empêche de mettre plein de <br>
dans les articles, alors que le site est en xhtml, et du coup de rendre le site non-valide.
C'est là qu'intervient HTML-Tidy, un magnifique programme qui corrige automatiquement le HTML. Il est disponible en tant qu'extension php, il semble activé par défaut chez all2all.
Pour intégrer ça à SPIP, voici une fonction qui répare des bout de HTML avec tidy :
<?php
/*
Retourne une version corrigée d'un bout de code HTML.
*/
function tidy_reparer($html) {
$tidy_config = array(
'doctype' => 'transitional',
'output-xhtml' => true,
);
$tidy = new Tidy();
$tidy->parseString($html, $tidy_config, 'utf8');
$tidy->cleanRepair();
// Tidy ajoute une balise html, un head, un body etc.
// On ne garde que le contenu du body.
$body_node = $tidy->body();
$body_inner_html = trim(preg_replace('#</?body>#', '', $body_node->value));
return $body_inner_html;
}
?>
Les options choisies ici sont pour du xHTML-transitional, mais il existe plein d'options pour modifier le comportement de tidy. Par exemple 'alt-text' => ''
pour ajouter automatiquement un attribut alt
vide aux balises img
qui ont été oubliées par le client.
Ensuite, on peut ajouter ceci aux traitements automatiques de SPIP avec cette fonction :
<?php
/*
Ajoute une fonction aux traitements automatiques d'une balise.
*/
function ajouter_traitement_auto($nom_balise, $nom_fonction) {
/* (phil) évite "Warning: Invalid argument supplied for foreach()"
dans l'espace privé */
if ( ! isset($GLOBALS['table_des_traitements']))
return;
if ( ! isset($GLOBALS['table_des_traitements'][$nom_balise])) {
$GLOBALS['table_des_traitements'][$nom_balise] = array();
}
foreach ($GLOBALS['table_des_traitements'][$nom_balise] as
$nom_table => $traitement) {
$GLOBALS['table_des_traitements'][$nom_balise][$nom_table] =
"$nom_fonction($traitement)";
}
if ( ! isset($GLOBALS['table_des_traitements'][$nom_balise][0])) {
$GLOBALS['table_des_traitements'][$nom_balise][0] = $nom_fonction.'(%s)';
}
}
?>
On peut alors dire à SPIP de passer toutes les balises #TEXTE
dans tidy_reparer en appelant cette fonction.
<?php
ajouter_traitement_auto('TEXTE', 'tidy_reparer');
?>