Suivre le Boop! blog

J’ai décidé de faire vite pour ajouter le flux d’actualités à Boop!, mon générateur de sites statiques, et c’est donc chose faite. Vous pouvez désormais vous abonner à ce site en ajoutant l’adresse dans votre agrégateur d’actualités préféré (qui devrait être capable de trouver l’adresse du flux tout seul, si si, mais si ça ne marche pas le flux est accessible ici).

Petit retour sur comment je m’y suis pris.

Distinguer les pages des articles

La première étape à laquelle je me suis trouvé confronté a été de distinguer les pages (en l’occurence, la page d’accueil) des articles. Jusqu’à maintenant, je n’avais pas eu besoin de faire une telle distinction, mais je ne veux pas me trouver avec la page d’accueil dans mon flux RSS. Pour cela, j’ai réorganisé toute la structure des répertoires, en m’inspirant cette fois-ci de ce qui pouvait se faire dans Jekyll (au lieu de Pelican qui me servait de base jusqu’à maintenant).

Auparavant, tout le contenu du site était déposé dans un répertoire ./content puis copié dans ./output (via une phase de transformation dans le cas des fichiers Markdown), désormais la structure est la suivante :

  • un fichier index.html à la racine ;
  • les articles, nécessairement au format Markdown, sont dans un répertoire ./articles (c’est original) ;
  • le template des articles se trouve dans un répertoire ./templates (toujours très original) ;
  • les fichiers à copier tels quels, comme les fichiers CSS, sont placés dans ./static ;
  • et le tout est copié/généré dans un répertoire ./site.

Je trouve personnellement cette structure un poil plus compliquée que la précédente, mais beaucoup plus explicite sur les intentions de chaque répertoire. Vous pouvez voir à quoi cela ressemble en suivant ce lien.

Vous pouvez aussi voir le commit introduisant le changement sachant qu’il en existe quelques autres mais que je n’ai pas envie de faire un lien vers chacun d’entre eux.

Dorénavant, les articles sont donc identifiables aisément car déposés dans un répertoire spécifique. J’ai décidé, en plus de cela, de les abstraire dans une classe particulière (Article) pour qu’ils soient plus faciles à manipuler par la suite (voir le commit).

Récupérer les informations manquantes via la configuration

Les flux RSS et Atom demandent des informations supplémentaires que je ne pouvais pas encore récupérer, notamment l’URL et le titre du site. Je devais aussi figer certains attributs présents dans les métadonnées des articles Markdown comme le titre, l’auteur et la date de publication. Par ailleurs, j’ai voulu correctement gérer les fuseaux horaires sachant la complexité que cela pouvait être par la suite. Il me fallait donc aussi récupérer le fuseau de l’auteur (pour ma part, Europe/Paris).

Je suis tout d’abord parti sur un simple fichier de configuration au format YAML pour indiquer les informations générales du site et alimenter une variable configuration (voir le commit).

J’ai ensuite créé quelques méthodes sur ma classe Article pour accéder facilement aux informations stockées dans les métadonnées. Ça leur donne ainsi un rôle particulier et me permet de faire des manipulations dessus à la volée (voir le commit).

Enfin, les fuseaux horaires sont gérés grâce au paquet externe pytz. Connaissant la complexité du sujet, je ne me suis pas amusé à développer mon propre module donc, là encore, petite entorse à ma règle de ne pas dépendre de code externe.

Les informations sont toutes facultatives, des valeurs par défaut étant générées à chaque fois, mais il est tout de même recommandé de les renseigner.

Générer le flux Atom, enfin !

Avec toutes ces informations en main, je pouvais enfin générer le flux RSS tant attendu. Mais encore un petit choix à faire avant : il existe deux formats « concurrents » pour générer des flux d’actualités, RSS et Atom. D’un point de vue simple utilisateur, les deux se valent et les deux sont très bien supportés par tous les agrégateurs d’actualités. Mon choix s’est porté sur Atom qui se voulait être pendant un temps une amélioration de RSS, mais surtout parce que mon site précédent utilisait déjà ce format. Et pourquoi pas les deux ? Parce que ça ne servirait à rien et que j’ai mieux à faire de mon temps, tout simplement.

Il ne me restait donc plus qu’à générer un document XML suivant le format Atom et l’écrire dans un fichier dans le répertoire ./site (voir le commit suivi de près par un autre destiné à abstraire la génération du XML dans un module nommé Boopfeed).

Et voilà, plus qu’à incorporer un lien dans l’en-tête de mes fichiers HTML vers ce fichier Atom, et c’est terminé !

Dans la tête d’un développeur

Bien entendu, je n’ai pas développé tout cela d’une traite. Entre poser à plat les problèmes que posaient l’implémentation initiale, décider d’une nouvelle structure après plusieurs essais, réfléchir à la meilleure manière de récupérer les informations manquantes, etc., ce travail m’a pris une journée entière durant laquelle je n’ai pas chômé.

Si mon historique Git paraît relativement linéaire, c’est que j’ai pris le soin de le réécrire avant de le publier, cela pour deux raisons :

  • un rôle pédagogique, si de futurs développeuses ou développeurs veulent comprendre ce que j’ai fait, l’enchaînement des commits leur paraîtront plus logiques ;
  • un rôle de débogage, si jamais j’ai introduit des bugs à un moment donné, il sera plus simple de retrouver à quel moment et pour quelle raison.

J’ai d’ailleurs fonctionné de manière totalement inverse lors du développement. En effet, j’ai commencé à écrire le code générant le flux Atom, en mettant les valeurs manquantes en dur dans le code, puis en le retravaillant au fur et à mesure.

Je fais cette petite précision pour les développeurs et développeuses moins expérimenté·es qui pourraient se dire qu’il leur est impossible d’arriver à ce résultat de façon aussi directe. Ça l’est effectivement, mais pour les autres aussi !

La technique, c’est fini

Je suis donc arrivé à un point du développement de Boop! qui me satisfait. Il manque bien évidemment plein de choses, et notamment il n’est pas possible de créer des pages qui ne soient pas des articles ; cela viendra plus tard.

Je souhaite désormais me consacrer au contenu du site car il ne sert à rien d’avoir une belle vitrine si ce qu’il transmet est creux et vide de sens. Les prochains articles devraient donc porter sur des réflexions plus personnelles : quel but je souhaite donner à ma vie, quelles sont mes valeurs, quelles pratiques je compte appliquer, etc. ; tout cela pour concevoir une vitrine cohérente avec mes aspirations à la fois personnelles et professionnelles.

Revenir à la série