Title: [FR] Méthodes de publication de mon blog sur plusieurs médias
       Author: Solène
       Date: 03 January 2021
       Tags: life blog francais
       Description: 
       
       On me pose souvent la question sur la façon dont je publie mon blog,
       comment j'écris mes textes et comment ils sont publiés sur trois
       médias différents. Cet article est l'occasion pour moi de répondre
       à ces questions.
       
       Pour mes publications j'utilise le générateur de site statique
       "cl-yag" que j'ai développé. Son principal travail est de générer
       les fichiers d'index d'accueil et de chaque tags pour chacun des
       médias de diffusion, HTML pour http, gophermap pour gopher et gemtext
       pour gemini. Après la génération des indexs, pour chaque article
       publié en HTML, un convertisseur va être appelé pour transformer le
       fichier d'origine en HTML afin de permettre sa consultation avec un
       navigateur internet. Pour gemini et gopher, l'article source est
       simplement copié avec quelques méta-données ajoutées en haut du
       fichier comme le titre, la date, l'auteur et les mots-clés.
       
       Publier sur ces trois format en même temps avec un seul fichier source
       est un défi qui requiert malheureusement de faire des sacrifices sur
       le rendu si on ne veut pas écrire trois versions du même texte. Pour
       gopher, j'ai choisi de distribuer les textes tel quel, en tant que
       fichier texte, le contenu peut être du markdown, org-mode, mandoc ou
       autre mais gopher ne permet pas de le déterminer. Pour gémini, les
       textes sont distribués comme .gmi qui correspondent au type gemtext
       même si les anciennes publications sont du markdown pour le contenu.
       Pour le http, c'est simplement du HTML obtenu via une commande en
       fonction du type de données en entrée.
       
       J'ai récemment décidé d'utiliser le format gemtext par défaut
       plutôt que le markdown pour écrire mes articles. Il a certes moins de
       possibilités que le markdown, mais le rendu ne contient aucune
       ambiguïté, tandis que le rendu d'un markdown peut varier selon
       l'implémentation et le type de markdown (tableaux, pas tableaux ?
       Syntaxe pour les images ? etc...)
       
       Lors de l'exécution du générateur de site, tous les indexs sont
       régénérées, pour les fichiers publiés, la date de modification de
       celui-ci est comparée au fichier source, si la source est plus
       récente alors le fichier publié est généré à nouveau car il y a
       eu un changement. Cela permet de gagner énormément de temps puisque
       mon site atteint bientôt les 200 articles et copier 200 fichiers pour
       gopher, 200 pour gemini et lancer 200 programmes de conversion pour le
       HTML rendrait la génération extrêmement longue.
       
       Après la génération de tous les fichiers, la commande rsync est
       utilisée pour mettre à jour les dossiers de sortie pour chaque
       protocole vers le serveur correspondant. J'utilise un serveur pour le
       http, deux serveurs pour gopher (le principal n'était pas
       spécialement stable à l'époque), un serveur pour gemini.
       
       J'ai ajouté un système d'annonce sur Mastodon en appelant le
       programme local "toot" configuré sur un compte dédié. Ces
       changements n'ont pas été déployé dans cl-yag car il s'agit de
       changements très spécifiques pour mon utilisation personnelle. Ce
       genre de modification me fait penser qu'un générateur de site
       statique peut être un outil très personnel que l'on configure
       vraiment pour un besoin hyper spécifique et qu'il peut être difficile
       pour quelqu'un d'autre de s'en servir. J'avais décidé de le publier
       à l'époque, je ne sais pas si quelqu'un l'utilise activement, mais au
       moins le code est là pour les plus téméraires qui voudraient y jeter
       un oeil.
       
       Mon générateur de blog peut supporter le mélange de différents
       types de fichiers sources pour être convertis en HTML. Cela me permet
       d'utiliser le type de formatage que je veux sans avoir à tout refaire.
       
       Voici quelques commandes utilisées pour convertir les fichiers
       d'entrées (les articles bruts tels que je les écrits) en HTML. On
       constate que la conversion org-mode vers HTML n'est pas la plus simple.
       Le fichier de configuration de cl-yag est du code LISP chargé lors de
       l'exécution, je peux y mettre des commentaires mais aussi du code si
       je le souhaite, cela se révèle pratique parfois.
       
       ```Code Common-lisp pour la déclaration des convertisseurs texte vers html
       (converter :name :gemini    :extension ".gmi" :command "gmi2html/gmi2html data/%IN | tee %OUT")
       (converter :name :markdown  :extension ".md"  :command "peg-markdown -t html -o %OUT data/%IN")
       (converter :name :markdown2 :extension ".md"  :command "multimarkdown -t html -o %OUT data/%IN")
       (converter :name :mmd       :extension ".mmd" :command "cat data/%IN | awk -f mmd | tee %OUT")
       (converter :name :mandoc    :extension ".man"
                  :command "cat data/%IN  | mandoc -T markdown | sed -e '1,2d' -e '$d' | multimarkdown -t html -o %OUT")
       (converter :name :org-mode  :extension ".org"
                  :command (concatenate 'string
                                        "emacs data/%IN --batch --eval '(with-temp-buffer (org-mode) "
                                        "(insert-file \"%IN\") (org-html-export-as-html nil nil nil t)"
                                        "(princ (buffer-string)))' --kill | tee %OUT"))
       ```
       
       Quand je déclare un nouvel article dans le fichier de configuration
       qui détient les méta-données de toutes les publications, j'ai la
       possibilité de choisir le convertisseur HTML à utiliser si ce n'est
       pas celui par défaut.
       
       ```Exemple de déclaration d'un nouveau texte à publier avec ses métadonnées
       ;; utilisation du convertisseur par défaut
       (post :title "Minimalistic markdown subset to html converter using awk"
             :id "minimal-markdown" :tag "unix awk" :date "20190826")
       
       ;; utilisation du convertisseur mmd, un script awk très simple que j'ai fait pour convertir quelques fonctionnalités de markdown en html
       (post :title "Life with an offline laptop"
             :id "offline-laptop" :tag "openbsd life disconnected" :date "20190823" :converter :mmd)
       ```
       
       Quelques statistiques concernant la syntaxe de mes différentes
       publications, via http vous ne voyez que le HTML, mais en gopher ou
       gemini vous verrez la source telle quelle.
       
       * markdown :: 183
       * gemini :: 12
       * mandoc :: 4
       * mmd :: 2
       * org-mode :: 1