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');
?>
⚠️ **GitHub.com Fallback** ⚠️