URL absolues dans les flux RSS

Une des bonnes pratiques Opquast est intitulée de la manière suivante :

Les hyperliens contenus dans les fils de syndication sont absolus.

Le problème avec DotClear 1.2.x est que les URL relatives présentes dans les billets ne sont pas converties au moment de la génération du flux RSS (ou Atom). Pour se conformer à cette bonne pratique il va falloir modifier le code pour intégrer cette conversion.

Important : modifier le core de DotClear, saimal, ça complique la maintenance et les mises à jour, donc c'est en connaissance de cause que vous faites les modifications. C'est d'ailleurs pour en garder une trace que j'écris ce billet.

Deux classes sont concernées. Il s'agit des classes xblogpost et xblogcomment (fonctions getRSSItem() et getAtomEntry() pour les deux classes) qui se trouvent respectivement définies dans les fichiers class.xblogpost.php et class.xblogcomment.php (répertoire layout), qu'il faudra modifier en utilisant une fonction que j'ai trouvée sur le blog de Gerd Riesselmann. Voilà le code de cette fonction de conversion :

<?php
function relToAbs($text, $base)
{
  if (empty($base))
    return $text;
  // base url needs trailing /
  if (substr($base, -1, 1) != "/")
    $base .= "/";
  // Replace links
  $pattern = "/<a([^>]*) " .
             "href=\"[^http|ftp|https]([^\"]*)\"/";
  $replace = "<a\${1} href=\"" . $base . "\${2}\"";
  $text = preg_replace($pattern, $replace, $text);
  // Replace images
  $pattern = "/<img([^>]*) " . 
             "src=\"[^http|ftp|https]([^\"]*)\"/";
  $replace = "<img\${1} src=\"" . $base . "\${2}\"";
  $text = preg_replace($pattern, $replace, $text);
  // Done
  return $text;
}
?>

Cette fonction se chargera de convertir les URL des hyperliens et des images présents dans le contenu. Elle attend deux paramètres, le contenu dans lequel se trouve (éventuellement) les URL à convertir et l'URL de base. Pour fournir cette dernière il faudra indiquer ceci util::getHost().dc_blog_url ce qui donnera dans mon cas http://franck.paul.free.fr/dotclear/[1]. Ensuite, il faut ajouter l'appel à la fonction de conversion une fois le contenu récupéré en utilisant la ligne suivante :

$content = util::relToAbs($content,util::getHost().dc_blog_url);

dans chacune des quatre fonctions citées plus haut.

Voilà maintenant une nouvelle bonne pratique mise en œuvre, ce qui au passage me permet de remplir toutes les conditions des premiers et deuxièmes niveaux de conformité.

Notes

[1] Il faudra éventuellement que vous adaptiez cette URL de base en fonction de vos habitudes. Pour ma part, je spécifie les URL internes par rapport à la racine du site et pas par rapport à la racine du blog pour obtenir une prévisualisation correcte des images pendant la saisie du billet, donc j'ai utilisé uniquement util::getHost() comme deuxième paramètre de la fonction.

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/3067

Haut de page