Thoth, un générateur de blog.

2015/03/02 | Simon Rodriguez |
Table of Contents

Cela fait bien longtemps que ce blog n'a pas été mis à jour (et ce n'est pas la première fois que j'écris cette phrase).

{#Thoth}
{#Thoth}
Ce site est passé par pas mal d'étapes. Son ancêtre a été commencé sur la plateforme Weblog, avant que je ne bascule sur Wordpress.com. J'y suis resté plusieurs années [1] : Wordpress est une plateforme puissante, stable et efficace. Les nombreux thèmes proposés me permettaient de satisfaire mon envie de nouveauté.
Mais Wordpress était entièrement en ligne : rédiger les articles, ajouter des images, changer le thème, tout devait se faire en ligne. Progressivement certaines fonctions ont bénéficié d'un mode hors-ligne, mais qui demeurait une béquille. En outre, rédiger ses articles en local dans son éditeur de texte préféré impliquait de mettre de côté les images pour un futur upload, copier-coller le texte en espérant que la mise en forme soit conservée, rajouter les liens, etc. Et toujours une adresse en wordpress.com, ce qui signifiait des redirections, des modifications DNS pour rediriger depuis une URL personnelle (ou payer pour le pack Wordpress Pro). J'ai bien pensé à utiliser Wordpress en mode auto-hébergé, mais mon nom de domaine n'était associé qu'à une très faible quantité de stockage.

L'année dernière, j'ai découvert que Github proposait à ses utilisateurs d'héberger leur site sous forme d'un repository [2], synchronisé avec un dossier local. Le choix était laissé de tout coder à la main (un peu long pour rajouter un article sur un blog), ou d'utiliser Jekyll. J'ai ainsi découvert les générateurs de blogs statiques. Plutôt que de s'appuyer sur pas mal de PHP et une base de données (comme Wordpress le fait) pour générer les pages d'articles dynamiquement lorsque les visiteurs les consultent, ces utilitaires se contentent de générer en local les pages une bonne fois pour toutes, remettant à jour l'index, etc. A charge ensuite pour l'utilisateur de tout uploader.
Ce système proposait plus de personnalisation, une utilisation hors-ligne, la possibilité de rédiger des articles sous forme de simples fichiers textes formaté en Markdown en leur ajoutant un en-tête et en les plaçant dans un dossier articles, etc. Je suis alors passé sous Jekyll+Github, utilisant l'outil d'import depuis Wordpress qui m'a permis de convertir et conserver mes anciens articles.

Jekyll est un fabuleux outil, bien documenté et très personnalisable [3]. Mais il restait quelques détails qui me freinaient :

D'autres détails n'étaient pas tant des problèmes que des éléments inutiles. Les en-têtes d'articles étaient parfois surchargés, le code HTML généré était lourd pour un simple blog avec quelques articles, etc. Entre temps, j'avais obtenu plus de stockage lié à mon site web, mais je ne me voyais pas revenir à Wordpress. Je continuais donc avec Jekyll.

L'histoire continue

Il y a quelques semaines (un peu avant le 9 février si j'en crois l'historique des commits), j'ai décidé de concevoir mon propre générateur de blogs, avec juste ce qu'il faut de fonctions. La liste de doléances était la suivante :

Avec ces quelques exigences en tête, j'ai commencé à développer Thoth. Et après un petit mois de développement, Thoth est fini !

Bonjour, Thoth

Son vrai nom est {#Thoth}[4], il a été écrit en Swift. Son nom[5] est celui du scribe des dieux égyptiens, lui-même dieu du savoir, de l'écriture et de la lune. Bien entendu, je me suis appuyé sur plusieurs bibliothèques pour certains éléments techniques (parce qu'il ne sert à rien de réinventer la roue) :

Dans le même temps j'ai créé un thème HTML/CSS par défaut à utiliser, même s'il n'est pas inclut avec l'installeur (qui se contente d'installer l'utilitaire en ligne de commande dans /usr/local/bin).

Thoth en ligne de commande
Thoth en ligne de commande

Technique(s)

Thoth n'est pas très technique. Le plus difficile a été de garder un code propre et ordonné [6], même si le traitement très linéaire des différentes tâches (charger le thème, charger les articles, générer les pages des articles, générer l'index) ne nécessitait pas de déployer des trésors d'abstraction et d'orienté-objet.

Créer un outil en ligne de commande exige toujours d'être attentif au traitement des arguments saisis en entrée par l'utilisateur, et de parer à toutes les erreurs qu'il peut faire. L'utilisation du template pour générer des pages avec du contenu a été une partie très interessante du développement, il s'agit majoritairement de jeux sur des chaines de caractères. Les footnotes, bien qu'un peu plus difficiles à mettre en oeuvre, étaient sinon du même acabit. La gestion des images et leur récupération s'est révélée plus simple que ce que j'appréhendais (la classe NSFileManager gérant d'emblée la plupart des erreurs et exceptions pour moi).

Thoth aura surtout été l'occasion de se familiariser avec Swift, et comprendre comment le faire interagir avec du code Objective-C, et comment les principales classes de Core Foundation s'y retrouvaient.

Vers le futur

Thoth a été développé assez rapidement, et n'est pas à l'abri de bugs, même si quelques tests ont été effectués par mes soins. La partie FTP notamment a du mal à gérer certaines connexions et les conflits. Les footnotes ne sont pour le moment traitées qu'inline. Les fichiers sitemap.xml et feed.xml ne sont pas générés. Le code est peu commenté et parfois mal rangé.

Mais Thoth est avant tout conçu égoïstement pour mon propre usage. Je suis conscient du fait qu'il ne conviendra probablement pas à grand monde, mais au cas où voici quelques instructions d'installation. La version complète en anglais est disponible sur le repo git.

Instructions

Après avoir installé Thoth, le plus simple est de le laisser créer un dossier pour votre blog, à l'endroit désiré :

$ thoth setup /chemin/vers/le/futur/dossier/du/blog

Thoth va automatiquement créer les dossiers nécessaires à son fonctionnement et un fichier de config, à remplir consciencieusement une bonne fois pour toute (même si les réglages ont tous une valeur par défaut, et vous n'êtes pas obligés d'indiquer la partie FTP si vous ne comptez pas vous en servir).

Ajoutez alors un template dans le dossier correspondant. Vous pouvez télécharger le mien depuis ici (sur le repo). Les fichiers index.html et article.html doivent être à la racine du dossier template.

Mettez vos articles dans le dossier articles, vos images où vous voulez du moment que les liens en local sont bons.
Pour la première génération, utilisez la commande

$ thoth first /chemin/vers/le/dossier/du/blog

Si vous ne voulez pas utiliser le FTP mais simplement générer une copie du blog en local, utilisez plutôt

$ thoth generate /chemin/vers/le/futur/dossier/du/blog -f

Ensuite, pour mettre à jour le blog après avoir écrit un article ou un brouillon, lancez

$ thoth scribe /chemin/vers/le/dossier/du/blog

ou de façon équivalente

$ thoth /chemin/vers/le/dossier/du/blog

ou

$ thoth generate /chemin/vers/le/futur/dossier/du/blog

pour une mise à jour en local. Les brouillons sont consultables via la page ` index-drafts.html`.

Particularités syntaxiques

Les notes de bas de page utilisent la syntaxe [ ^ contenu de la note]. La taille d'une image doit être spécifiée dans son titre, comme suit :

![alt text](chemin/vers/image.png "800,600,titre")

ou juste

![alt text](chemin/vers/image.png "800,titre")

Si aucune taille n'est précisée, la largeur par défaut indiqué dans le fichier de configuration sera utilisé. Dans tous les cas, les images en local seront copiées dans un dossier spécifique à l'article.

Plus de détails sur les commandes, leur liste complète, les différentes options, la création de thèmes en utilisant des mots-clés,... sont disponibles sur le repository.

Bien sûr, mon blog est désormais généré par Thoth !


  1. apparement seulement 3 

  2. plus de détails sur la page dédiée 

  3. Site officiel 

  4. parce que les balises utilisés pour les thèmes sont de la forme `{#...}` 

  5. j'utilise la graphie anglaise, quoiqu'elle soit parfois reconnu en français 

  6. comme souvent, d'aucuns diront