Migration vers Zola et présentation d’Émile

Et oui, encore un changement de technologie pour le blog ! Il reste statiquement généré bien sûr, je change juste le générateur utilisé : Zola.

🔗Le soucis avec Cobalt

J’avais opté pour Cobalt alors que Zola existait déjà, avec bien plus de fonctionnalités. Ce choix, je l’avais fait parce que je voulais pratiquer Rust et comme il y avait plein de features manquantes dont j’avais envie, c’était le bon prétexte.

Après une période très productive, le mainteneur du projet m’ayant même appris plein de choses sur Rust, le rythme s’est radicalement ralenti. Je travaillais sur la fonctionnalité de pagination pour Cobalt, et avec sa vision, on est arrivé à une solution plutôt puissante et on en était à la dernière phase : l’activation par défaut.

On en discutait pour le faire de la meilleure façon possible, et à un moment, la discussion s’interrompit. Après un mois de silence complet sur Cobalt alors qu’il était actif sur d’autres projets, je lui ai posé la question sur l’avenir de Cobalt et il m’a répondu qu’il n’en savait trop rien et qu’en effet, il était d’avantage motivés par ces autres projets pour l’instant, et m’a, à contre-cœur, conseillé de passer à Zola.

🔗Migration

Le portage du template n’a pas été très difficile. Les seuls points qui ont nécessité un peu de travail furent la compréhension du modèle d’héritage disponible dans Tera et l’absence d’un moyen d’avoir le nombre total de posts quand on utilise la pagination.

🔗Tera

Tera est le langage utilisé pour les templates. Très similaire à Liquid, il a toutefois des fonctionnalités qui sont assez puissantes. J’ai évoqué l’héritage : cela permet de définir un patron de base avec des sections nommées, qui peuvent être remplacées par d’autres blocs de code dans les fichiers fils. J’ai du aussi convertir des bouts de template en des macros pour faire des choses qui étaient simplement gérées par un include en Liquid.

Je n’entre pas dans les détails, et je vous laisse regarder le template de base et deux héritages:

Le tout est bien sûr disponible sur GitHub.

🔗Nombre total de posts

Ce manque fût le prétexte à ma première contribution à Zola et sera dispo en 0.10. :D C’était pas sorcier, le fix tiens en une ligne. ^^' Mais il donne accès à paginator.total_pages qui n’existait donc pas.

🔗Migration des posts

La migration des anciens posts (plus de 130 quand même !) a été évidemment fastidieuse, mais à coup de chercher-remplacer, ça a dû prendre un peu plus d’une demi-heure, le plus pénible ayant été les tags, vu que Cobalt les accepte sans guillemets et pas Zola. Il a fallu les ajouter partout. >_<

Je me suis aidé d’un petit raccourcis clavier maison à ajouter dans keybindings.json :

{
    "key": "alt+p",
    "command": "editor.action.insertSnippet",
    "when": "editorTextFocus",
    "args": {
        "snippet": "\"${TM_SELECTED_TEXT}\""
    }
}

Comme ça, je sélectionne le mot, un coup de Alt+p, et ça l’entoure de guillemets, vu qu’en markdown, ça ne le fait pas tout seul, contrairement au mode Rust par example.

Ensuite, je me suis gratté la tête un petit moment : Zola ne supporte pas le templating de l’adresse des pages. En effet sur Cobalt, j’ai pu configurer le générateur pour qu’il place mes articles à un emplacement dépendant de la date, par exemple : /posts/2019/11/mon-post/.

J’ai alors demandé si c’était une feature qui était prévue et Keats, le mainteneur de Zola, m’a redirigé vers le ticket GitHub qui traite de la même demande. Dedans, il explique pourquoi il n’est pas emballé par l’idée. Je ne comprenais pas trop le soucis au début, mais en utilisant les liens internes vers d’autres articles du blog, je devais écrire :

@/posts/2018-12-28-my-wishlist-for-rust-2019.md

Et là, la révélation… si jamais un jour je mets à jour l’article et change sa date, faut que je me retape tous les liens que j’ai pu utiliser à travers le blog. Ni une, ni deux, j’ai écrit un bout de code Rust pour convertir tous mes fichiers sans date dans le nom de fichier et inclure la date dans le frontmatter des posts.

Le problème était déjà présent avec Cobalt, mais Zola vérifie les liens internes arrête la construction du site en cas de lien mort, ce qui m’aurait obligé à faire les corrections avant de pouvoir publier là où avec Cobalt, j’aurai eu le site… plein de liens morts mais le site quand même. ^^'

🔗Émile

J’avais présenté comment j’automatisais le processus de publication. J’utilisais, entre autre, cobalt publish qui s’occupait de bouger l’article du dossier des brouillons vers le dossier des publications, changeait la date à la date du jour et passait le flag brouillon à faux.

Une autre commande que j’aimais bien avec Cobalt, c’était tout simplement new pour créer un nouvel article en utilisant un petit squelette tout prêt à recevoir les tags.

Zola n’a pas ces fonctions et Keats n’avait aucune intention de les inclure car ça n’apporte pas énormément de valeur ajoutée, ce qui n’est pas faux. Mais moi, j’aimais bien ces fonctions quand même et sans, mon workflow était tout cassé. :(

C’est ainsi qu’est né Émile, un compagnon à Zola (ayé ? vous l’avez ? :p). Écrit en Rust, il rassemble tout ce que j’ai bidouillé avec de multiples scripts, ainsi que les commandes new et publish de Cobalt sous un seul binaire !

Ainsi, je garde mon workflow (décrit dans un article en anglais), simplifié, vu que je n’appelle plus que emile git-hook pour traiter les fichiers et le code me restera compréhensible dans 6 mois, ce qui n’est plus trop le cas du pack de scripts que j’ai pondu l’an dernier. ^^'

🔗Conclusion

Avec l’aide d’Émile, Zola me donne entièrement satisfaction, j’apprécie particulièrement la commande serve qui est plus puissante que celle de Cobalt, vu que la page se mets à jour automatiquement dans le navigateur quand Zola détecte un changement ! Ça me fait autant de F5 en moins à faire ! :p

Il me reste toujours ce regret de ne pas avoir pu assister à la distribution de mon code pour la pagination dans Cobalt, ça aurait été une sacrée consécration ! Peut-être que je ferais une contribution aussi significative sur Zola un jour. ^^'