Publish a single file with emacs org-mode
I often write small articles on some experience I make, and since I want to move towards using static pages more often, I tried using emacs org-mode publishing for that. Strangely the simple usecase of publishing a single file seems quite a bit more complex than needed, so I document the steps here.
This is my first use of org-publish, so I likely do not use it perfectly. But as it stands, it works. You can find the non-static version of this article at draketo.de/light/english/emacs/publish-single-file-org-mode - naturally exported from this article via org-mode :)
Table of Contents
Why static pages?
I recently lost a dynamic page to crackers. I could not recover the content from all the spam which flooded it. It was called good news and I had wanted to gather positive news which encourage getting active - but I never really found the time to get it running. See what is left of it: http://gute-neuigkeiten.de
Any dynamic page carries a big maintenance cost, because I have to update all the time to keep it safe from spammers who want to abuse it for commercial spam - in the least horrible case. I can choose a managed solution, but that makes me dependant on the hoster providing what I need. Or I can take the sledgehammer and just use a static site: It never does any writes to the webserver, so there is nothing to hack.
As you can see, that’s what I’m doing nowadays.
Why Emacs Org-Mode?
Because after having used MacOS for almost a decade and then various visual-oriented programs for another five years, Emacs is nowadays the program which is most convenient to me. It achieves a level of integration and usability which is still science-fiction in other systems - at least when you’re mostly working with text.
And Org-mode is to Emacs as Emacs is to the Operating System: It begins as a simple todo-list and accompanies you all the way towards programming, reproducible research - and publishing websites.
Current Solution
Currently I first publish the single file to FTP and then rename it to index.html. This translates to the following publish settings:
(setq private-publish-ftp-proj (concat "/ftp:" USER "@" HOST ":arnebab/proj/")) (setq org-publish-project-alist '(("orgmode-single-file" :base-directory "~/.emacs.d/private/journal" :publishing-directory (concat private-publish-ftp-proj "orgmode-single-file/") :base-extension "org" :publishing-function org-html-publish-to-html :completion-function (lambda () (let ((htmlfile (concat private-publish-ftp-proj "orgmode-single-file/2013-11-25-Mo-publish-single-file-org-mode.html"))) (if (file-exists-p htmlfile) (rename-file htmlfile (concat private-publish-ftp-proj "orgmode-single-file/index.html") t)))) :section-numbers nil :with-toc t :html-preamble t :exclude ".*" :include ["2013-11-25-Mo-publish-single-file-org-mode.org"])))
Now I can use C-c C-e P x orgmode-single-file to publish this file to the webserver whenever I change it (or just C-c C-e P a to publish all changed projects).
Note the (lambda ()): I simply rename the published to index.html, because I did not find out, how to use a file as index.html by just setting an option. :index-filename did not work. But likely I missed something which would make this much nicer.
Also note that if I had wanted to publish a folder full of files, this would have been much easier: There actually is an option to create an automatic index-file and sitemap.
For more details, read the org-mode publishing guide.
Conclusion
This is not as simple as I would like it to be. Maybe (or rather: likely) there is a simpler way. But I can now publish arbitrary org-mode files to my webserver without much effort (and without having to switch context so some other program). And that’s something I’ve been missing for a long time, so I’m very happy to finally have it.
And it was less pain that I feared, though publishing this via my drupal-site, too, obviously shows that I’m still far from moving to static pages for everything. For work-in-progress, this is great, though - for example for my Basics for Guile Scheme.