Kirby : mettre en place un flux RSS

À ce jour, je ne connais pas mieux que les flux RSS1 pour suivre la publication de nouveaux contenus.

Cette technologie est une petite merveille dans le web centralisé d’aujourd’hui.

  1. On choisit le contenu, le rythme de lecture, l’affichage… Exit les obscurs algorithmes des réseaux sociaux, censés savoir mieux que nous ce que l’on souhaite lire.
  2. On ne partage aucune donnée personnelle, on n’encombre pas sa boîte de réception et surtout on contrôle la désinscription.
  3. On ne dépend pas d’un outil ou d’une plateforme2.

Proposer un flux web ici relevait donc de l’évidence pour moi.

Je n’avais jamais eu à y réfléchir avant, puisque dans WordPress ou Dotclear, qui sont des CMS clé en main ou presque, la fonctionnalité est incluse par défaut. Ce n’est pas le cas pour Kirby, même dans sa version kit de démarrage (Starterkit) que j’utilise. Assembler chaque brique de son site (et ainsi mieux les comprendre) fait partie du charme de ce CMS.

Je détaille ci-dessous ce que j’ai fait et obtenu après quelques tâtonnements.

Créer le flux RSS

Pour créer un flux RSS de mes notes, j’utilise le plugin kirby3-feed de Bruno Meilick (bnomei).

Au préalable, télécharger la dernière version du plugin et décompresser le dans le dossier plugins qui se trouve dans site. Si ce dernier n’existe pas, créer le dossier.

Voici les étapes suivies pour générer un flux :

  1. Dans le dossier content, ajouter un dossier feed et y mettre un fichier feed.txt vide.
  2. Dans le dossier templates, créer un template dédié (feed.php) , avec le modèle fourni par la documentation.

On peut y ajouter des options pour surcharger les valeurs par défaut.

<?php
$options = [
    'title'       => 'Luce Carević - Notes',
    'description' => 'Dernières notes',
    'link'        => 'notes',
];
echo page('notes')->children()->listed()->flip()->limit(10)->feed($options);
  1. title : titre du flux ;
  2. description : description du flux ;
  3. link : lien du site3 ;
  4. page('notes'): remplacer « notes » par le groupe de pages pour lequel vous voulez générer un flux.

Dans la balise <head>, on ajoute un lien vers le flux.

<link rel="alternate" type="application/rss+xml" title="S’abonner aux dernières notes" href="<?= site()->url() ?>/feed"/>

À cette étape, le site possède déjà un flux RSS fonctionnel et détectable.

Adapter le flux

Corriger le rendu des titres

Comme j’utilise parfois du code html dans les titres de mes articles4, le rendu de mon flux n’était pas satisfaisant dans certains outils.

Dans Miniflux (v1) par exemple, le code html n’est pas interprété et apparaît en dur. C’est illisible.

Deux solutions :

  1. Supprimer le balisage html.
  2. S’assurer que le html sera interprété partout.

Après avoir fait plusieurs tests (et découvert les joies de XML et de XSLT), je suis arrivée à la conclusion que je ne serai jamais sûre que le html serait interprété dans tous les outils.

Supprimer le balisage html reste donc le meilleur compromis en l’état pour les utilisateurices5.

Pour modifier le flux xml généré, il faut aller dans le dossier snippets du plugin et modifier le fichier rss.php.

Attention :

  1. à vérifier que vos modifications ne cassent pas votre flux RSS ;
  2. à sauvegarder le snippet et reporter les modifications que vous avez effectuées lors des mises à jour du plugin.

Je vous conseille de bien lire la spécification, ça vous évitera de faire des bêtises comme moi.

J’ai utilisé Str::unhtml() pour supprimer les balises HTML présentes.

<title><?= \Kirby\Toolkit\Xml::encode(Str::unhtml($item->{$titlefield}())) ?></title>

« Réagir par courriel »

Je déplorais qu’on ne puisse pas commenter facilement depuis un lecteur de flux RSS.

Depuis, de nombreuses personnes que je lis ont ajouté un moyen de contact par courriel dans leur flux. C’est le cas notamment du blog métro[zen]dodo.

Je me suis empressée de leur emboîter le pas et d’ajouter une incitation à m’écrire avec un lien mailto.

Ça se fait dans la balise <description> en prenant soin d’ajouter son contenu à l’intérieur de <!CDATA[]]>.

<description><![CDATA[<?= $item->{$textfield}()->kirbytext() ?><p>Vous souhaitez réagir ? N’hésitez pas à <a href="mailto:contact@luce.carevic.eu?subject=<?= Str::unhtml($item->{$titlefield}()) ?>">m’écrire</a>]]></description>

Bon à savoir pour ne pas s’arracher inutilement les cheveux. Certains lecteurs de flux peuvent ne pas supporter les liens mailto6.

Petites coquetteries

La spécification prévoit quelques éléments optionnels qui ne sont pas ou peu utilisés par les lecteurs de flux.

J’ai ajouté :

  1. <webMaster> ;
  2. <language> ;
  3. <generator> : une manière supplémentaire de créditer l’auteur de l’extension qui me permet de générer ce flux ;
  4. <docs> : un rappel toujours utile vers la spécification RSS.

Styler et présenter le flux

RSS est formidable, mais potentiellement difficile d’accès pour les néophytes.

Par défaut, l’expérience n’est pas terrible. Firefox télécharge le fichier RSS… Chrome ou Edge affiche le code source. Safari propose au moins de télécharger un lecteur.

Je ne souhaitais donc pas simplement ajouter un lien « Suivre » ou « Flux ».

Ajouter une feuille XSL

J’ai découvert grâce à David Larlet que l’on pouvait afficher une page de présentation pour son flux RSS. Ça se fait avec une feuille XSL.

J’ai repris et adapté la feuille pretty-feed-v3.xsl, fournie par le projet About Feeds. J’ai essentiellement traduit et modifié les textes, corrigé les quelques problèmes d’accessibilité habituels et allégé la feuille de style.

J’ai piqué l’idée (et le code JavaScript) du champ avec l’URL du flux à la feuille proposée par Dotclear7.

  1. Déposer le fichier xsl dans le dossier assets directement ou dans un sous-dossier.
  2. Ajouter la ligne suivante dans le fichier rss.php :
echo '<?xml-stylesheet href="/assets/feed/nom-fichier.xsl" type="text/xsl"?>';
  1. Dans le template feed, ajouter l’option suivante : 'mime' => 'xml'8.
<?php
$options = [
    'title'       => 'Luce Carević - Notes',
    'description' => 'Dernières notes',
    'link'        => 'notes',
    'mime'        => 'xml'
];

Désormais, le lien vers le flux affiche une page de présentation.

Gérer les dates

Le format de date affiché par défaut (Fri, 20 Aug 2021 00:00:00 +0200) ne m’allait pas du tout. Comme je suis un boulet, j’ai d'abord modifié le contenu du champ <pubDate> pour obtenir le format voulu. Ce faisant, j’ai cassé la gestion des dates. Oups !

Avec XSLT 2.0, une fonction (format-dateTime) permet de formater les dates. Comme je n’ai pas compris comment l’utiliser, je me suis débrouillée autrement.

Je suis retournée dans le fichier rss.php et j’ai ajouté un élément custom pour y mettre la date de publication de l’article au format souhaité.

Dans le fichier xml (rss.php) :

<lcustom:joliDate><?= $item->{$datefield}()->toDate('%A %d %B %Y') ?></lcustom:joliDate>

Dans le fichier xsl, j’ai remplacé <xsl:value-of select="pubDate" /> avec :

<xsl:value-of select="lcustom:joliDate" />

Élément xml custom et namespace

Pour que le flux soit considéré valide, il faut déclarer un namespace. Je vous invite à lire la documentation en ressource et liste ci-dessous simplement ce que j’ai fait.

Dans le fichier rss.php, j’ai donc ajouté xmlns:lcustom="https://www.luce.carevic.eu/".

<rss version="2.0" […] xmlns:lcustom="https://www.luce.carevic.eu/">

Dans le fichier xsl (XSLT 2.0) :

xmlns:lcustom="https://www.luce.carevic.eu/" xpath-lcustom="https://www.luce.carevic.eu/"

Sans ça, on ne peut pas appeler l’élément custom.

Un dernier passage par le validateur pour vérifier que tout est dans les clous. « Félicitations ! Ceci est un flux RSS valide. »

Conclusion

Je suis contente d’avoir pris le temps de creuser le sujet flux RSS pendant mes congés. Ajouter une page de présentation n'était peut-être pas le plus prioritaire sur ce site, j’avais déjà un flux fonctionnel, mais en chemin j’ai appris énormément de choses et je comprends beaucoup mieux comment fonctionnent les flux.

J’espère que cet article vous incitera à mettre en place un flux sur votre site si vous n’en avez pas encore ou à le personnaliser si vous en avez déjà un.

Je n’en ai pas encore complètement fini sur ce que je veux faire avec RSS, mais ça sera pour une prochaine fois.

Je ne sais pas encore quand, mais si vous suivez mon flux, vous serez forcément au courant 😉.

Ressources

Spécifications et validateur

Les spécs, c’est bon. Mangez-en !

  1. Spécification RSS 2.0.1
  2. XSL Transformations (XSLT) Version 3.0
  3. Validateur de flux

Namespace

  1. How to declare namespaces
  2. Extending RSS 2.0 With Namespaces
  3. Namespaces in XSLT

Agrégateurs

Vous devriez trouver un agrégateur qui vous convient.

J’utilise Inoreader, mais je redécouvre NetNewsWire (environnement Apple uniquement), open source et gratuit, qui me semble vraiment très bien.

J’aimais beaucoup Miniflux que j’auto-hébergeais dans sa version PHP. Je ne saurai pas vous dire ce que vaut la v2.

Récemment, j’ai découvert une approche originale avec Flus. J’apprécie beaucoup la démarche du projet qui semble à première vue, et c’est suffisamment rare pour le noter, se soucier de l’accessibilité.


  1. Oui, je sais que l’on devrait plutôt parler de syndication de contenu et que RSS est un format de données. ↩︎

  2. RSS n’est (heureusement !) pas mort avec Google Reader et il existe aujourd’hui une foultitude de lecteurs de flux (ou agrégateurs). ↩︎

  3. Je renvoie sur la page qui liste tous les articles plutôt que vers ma page d’accueil qui est toute vide. ↩︎

  4. Essentiellement pour masquer des emojis décoratifs aux lecteurs d’écran et pour indiquer des changements de langue. ↩︎

  5. Histoire d’améliorer un peu la restitution des lecteurs d’écran, j’ai retiré les quelques emojis encore présents et les termes anglais dont je pouvais me passer. Il restera ponctuellement quelques termes qui ne seront pas correctement vocalisés. ↩︎

  6. Miniflux (v1), que j’ai un temps utilisé, les supprime par exemple. Le problème semble depuis avoir été corrigé en v2↩︎

  7. Il m’aura fallu 14 ans pour me rendre compte que cette fonctionnalité existait… ↩︎

  8. Sans l’aide précieuse apportée sur le forum Kirby, j’y serai encore ! ↩︎

Contact

Vous souhaitez réagir ? N’hésitez pas à m’écrire à contact@luce.carevic.eu.