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.
1 De tehu -
Il est vrai que les URL absolues sont requises dans les formats RSS. Seulement Atom dispose d'une alternative : l'attribut xml:base (dans les conteneurs feed ou entry) qui précise la base, ce qui évite de modifier le reste. Comme exemple, voir le feed du blog de Tim Bray, ongoing.
Je viens de lire que xml:base est aussi valable dans le peu connu RSS 1.1 (une version mise à jour de RSS 1, sortie en 2005).
2 De Franck -
Merci pour les infos tehu. Il va falloir que je jette un œil du côté de DotClear 2ème du nom qui génère un flux RSS 2.0.
3 De RSS -
a Franck, vous écrivez à un heure drôlement mayinale ;)
4 De Franck -
Et ?