Yet Another Blog with Org-mode
L'objectif de ce post est de vous permettre d'installer un blog à partir d'org-mode le plus possible out of the box. Il existe en effet beaucoup de documentation en ligne pour faire des exports de blog avec org-mode. Deux espèces principalement: des docs ecrites par des gens qui n'ont pas bien réussi et qui font perdre du temps, et des doc écrites par des kadors qui, comme les grands cuisiniers, oublient de préciser deux ou trois choses qui auraient permis que ça puisse marcher pour nous. Je vais donc essayer de vous faire gagner le temps que j'ai perdu.
Ce que je ne dirai pas ici
Je ne dirai pas ici tout le bien que je pense d'emacs et d'org-mode. Cet article s'adresse à ceux qui sont déjà convaincus. Mais pour ceux qui ne le sont pas encore, ce sera peut-être l'occasion de s'y intéresser.
Prérequis
Il faut disposer d'Emacs et de son mode majeur Org-mode. Sous linux:
sudo apt install emacs Org-mode
Un mot quand même sur les sites statiques
Les sites dynamiques posent trois problèmes
- Si on les héberge soi-même on y passe du temps (changement de version, sécurité, etc)
- Si on les fait héberger, on se fait piller ses données etc..
- Mais surtout les données initiales ne sont nulles part ailleurs que dans le CMS, et souvent dans un format inexploitable pour d'autres usages.
Comme on a séparé le contenu et la mise en forme1 il est urgent de séparer les originaux (les codes source des articles) et leur présentation en ligne (le code exécutable). D'où l'idée de produire dans des formats statiques mais riches et à base de texte brut2 (Org-mode3 [2003], Markdown4 [2004]…) et d'exporter vers le web.
Ne pas perdre tout le bénéfice des sites dynamiques
Le pur javascript sans référence à jquery, le latex sans utilisation de MathJax5 relèvent de la prudence.
Ajouter dix lignes de php pour disposer d'un moteur de recherche sur le contenu du blog n'est pas absurde.
Pourquoi org-static-blog6 ?
Même si c'est une solution mono blog7 j'ai choisi org-static-blog, parce que c'est celle que j'ai réussi à faire marcher (en dehors de l'export standard qu'une seule page html) Org-mode
Le principe
- Un répertoire dédiés à vos .org.
- Un répertoire cible déstinées à accueillir votre site statique. Dans un premier temps, indiquez un répertoire sur votre disque. Il s'agit d'un site statique qui peut s'exécuter en local dans votre navigateur pour commencer8.
- Une configuration.
- Une commande pour créer un nouveau draft (qu'il suffira de déplacer dans les posts pour qu'il fasse partie des pages qui iront peupler le blog en html).
- Une commande9 pour créer une nouvelle page.
- Une commande pour publier, c'est-à dire en fait pour mettre à jour10.
Et c'est tout. Une fois que c'est installé, ça marche vraiment très bien. Avant de mettre à jour il faut évidemment que les buffers ouverts des articles soient bien enregistrés sinon ça peut coincer, mais c'est après tout normal.
L'installation
- copier le fichier org-static-blog.el dans le répertoire ~/.emacs.d
Vous le trouverez ici: https://raw.githubusercontent.com/bastibe/org-static-blog/master/org-static-blog.el
- dans le fichier init.el de votre répertoire ~/.emacs.d il faudra ajouter les lignes suivantes (en les adaptant):
;; ;; org-static-blog ;; ;; chargement du fichier (load-file "~/.emacs.d/org-static-blog.el") ;; ;; configuration ;; ;; affectation des touches F6, F7 et F8 pour gagner du temps (global-set-key (kbd "<f8>") 'org-static-blog-publish) ; F8 (global-set-key (kbd "<f7>") 'org-static-blog-create-new-post) ; F7 (global-set-key (kbd "<f6>") 'org-static-blog-create-new-draft) ; F6 ;; ;; ADPATEZ les quatre ou cinq lignes suivantes à votre situation ;; (setq org-static-blog-publish-title "Mon blog à moi qu'il est beau") (setq org-static-blog-publish-url "https://domain.org/blog/") (setq org-static-blog-publish-directory "~/blog-html/") (setq org-static-blog-posts-directory "~/blog-org/") (setq org-static-blog-drafts-directory "~/blog-drafts/") (setq org-static-blog-langcode "fr") (setq org-static-blog-enable-tags t) (setq org-export-with-toc t) (setq org-export-with-section-numbers nil) (setq org-static-blog-use-preview t) (setq org-static-blog-preview-convert-titles nil) (setq org-static-blog-preview-ellipsis "(...)") (setq org-static-blog-preview-link-p t) ;; ;; ADAPTEZ aux rubriques que vous voulez mettre en avant ;; Il n'est pas sûr que riri, fifi et loulou vous conviennent ;; Et vous préférerez problement remplacer Mickey Mouse par votre nom ;; (setq org-static-blog-page-header "<meta name=\"author\" content=\"Mickey Mouse\"> <meta name=\"referrer\" content=\"no-referrer\"> <link href= \"movenotes.css\" rel=\"stylesheet\" type=\"text/css\" /> <link href= \"style.css\" rel=\"stylesheet\" type=\"text/css\" /> <script type=\"text/javascript\" src=\"movenotes.js\"></script> <style> .equation-label { visibility:hidden} svg { height:200%;} </style <link rel=\"icon\" href=\"favicon.ico\">") ;; ;; This preamble is inserted at the beginning of the <body> of every page: ;; This particular HTML creates a <div> with a simple linked headline (setq org-static-blog-page-preamble "<center><div class='header'> <a href='tags.html'>[tags]</a> <a href='archive.html'>[archives]</a> <a href='tag-riri.html'>[riri]</a> <a href='tag-fifi.html'>[fifi]</a> <a href='tag-loulou.html'>[loulou]</a> </div></center>") ;; ;; This postamble is inserted at the end of the <body> of every page: ;; This particular HTML creates a <div> with a link to the archive page ;; and a licensing stub. (setq org-static-blog-page-postamble "<footer><center><img alt=\"Creative Commons License\" style=\"border-width:0\" src=\"https://i.creativecommons.org/l/by-sa/3.0/88x31.png\" /> <br/>Mickey Mouse + Org-mode + Emacs + Apache + GNU/Linux</center></footer><script type=\"text/javascript\" src=\"footer.js\"></script> ")
Installation de movenotes et d'une feuille de style11
Les principes de design pour ce/mon blog
- Ne pas utiliser toute la largeur pour les grands écrans (on lit plus vite)
- Et donc si on a la place on peut avoir la table des matières à gauche en position fixe
- Les notes à droite en regard de l'appel de notes (pour éviter d'avoir à faire défiler la page). Je ne suis pas peu fier d'avoir trouvé une solution en 14 lignes de javascript!
- un pied de page qui se place en fin d'écran, sinon après le contenu
J'ai traité trois cas
- les écrans d'ordinateur
- le mode portrait des mobiles
- la table des matières au début
- les notes à la fin
- les caractères agrandis pour le confort de lecture
- le mode paysage des mobiles
- comme sur un ordinateur mais les caractères agrandis
Les fichiers à placer dans votre répertoire cible
Pour avoir la même apparence que ce blog, mettez dans votre répertoire cible (pour ceux qui sont pressés: voici un zip)
- pour movenotes
- une feuille de style style.css dans laquelle vous pourra travailler à votre guise: style.css
- le fichier ./footer.js qui est exécuté à la fin du fichier12.
[TODO] Si vous êtes pressés
Si vous n'avez pas de répertoires blog-org, blog-html et blog-draft dans votre répertoire home et si vous acceptez de lancer un script qui ajoute quelque chose à votre ~.emacs.d/init.el/ je vous propose le script suivant13: [TODO]
La mise en oeuvre
Relancez emacs14.
- F7 vous créez un article
- F8 vous mettez à jour votre blog
- vous regardez le résultat avec un navigateur dans file:///user/blog-html15
Pour mettre Table des matières au lieu de Table of contents
L'affectation de la variable org-static-blog-langcode "fr" dans la configuration ne concerne que les chaines de caractère produites par org-static-blog. Table of Contents est exporté par org-mode et dépend d'une autre variable. Il existe deux façons de faire sans toucher à l'environnement global d'emacs.
- mettre à la main #+LANGUAGE: fr dans l'en-tête de chaque page…
- lui dire de le faire pourchaque nouvelle page en changeant dans org-static-blog.el
(insert "#+title: " title "\n" "#+date: " (format-time-string "<%Y-%m-%d %H:%M>") "\n" "#+filetags: ")))
par
(insert "#+title: " title "\n" "#+date: " (format-time-string "<%Y-%m-%d %H:%M>") "\n" "#+filetags: \n#+LANGUAGE: fr")))
Notes de bas de page:
Le html et les css pour faire court.
Les fichiers contenant de l'information et qui s'ouvrent avec un éditeur de texte brut sont pérennes. Les fichiers qui pour être ouverts réclament telle version de tel logiciel seront probablement impossibles à ouvrir un jour.
Org-mode dispose d'une palette d'exports puissante, accessible par C-c C-e
Pandoc permet au format markdown d'être un quasi pivot vers beaucoup de formats. Mais… il existe un module ox-pandoc qui permet d'exploiter pandoc à partir d'Org-mode.
J'y reviendrai plus tard, et je proposerai une solution pour exporter toutes les images calculées (latex, graphviz, msgen, etc.) en svg. Si on ne fait rien, par défaut c'est MathJax qui est utilisé par défaut.
Un développement à venir peut-être: transformer org-static-blog en multi-blog.
Le contenu de ce répertoire peut être ensuite mis en ligne de plusieurs manières:
- sans rien faire s'il s'agit d'un montage en sshfs par exemple, les pages seront produites sur le plateau du serveur;
- par ftp etc..
Je me suis fait pour ces deux commandes deux touches dédiées: F7 et F8, je l'indiquerai plus loin dans ce qui sera consacré à l'installation.
Pour forcer une mise à jour complète il suffit de supprimer les pages html dans le répertoire cible. Elles sont alors reconstruites.
Si vous placez un fichier favicon.ico il l'utilisera.
Dans la version de base, il dispose les images alternativement à gauche et à droite.
Il faut évidement être connecté à l'internet parce qu'il va faire ses emplettes en ligne.
Ce n'est en fait pas nécessaire. Si vous êtes dans emacs, vous pouvez charger ~/.emacs.d/init.el et l'évaluer par M-x eval-buffer.
Remplacez user par votre nom d'utilisateur et adpatez si vous avez changé le répertoire cible.