Emacs as a Static Site Generator
I’ve been hosting my website on GitHub Pages since 2014. Over the years I have tended to rewrite my website whenever I was learning a new programming language.
I started out with a “pure” HTML+CSS website and eventually moved on to Python, where I used the Frozen-Flask package to bundle my Flask app into a set of static files. As time went on, I started writing my own static site generators: first in Bash+Pandoc, then Common-Lisp, and later Go(lang).
Overall I have enjoyed writing my own static site generators and think it’s a great project for exploring a new programming language. In fact, whenever I’ve tried migrating to one of the popular options like Hugo, I ultimately went back to doing it myself because I hated dealing with auto-generated files, customizing themes, and digging through incomplete documentation.
I have been using Emacs and Org Mode for a long time but never
explored the org-publish
functionality. It’s far from perfect, but
it’s incredibly convenient. Like most things Emacs, org-publish
can
be configured to do just about anything. So far I only use it to
generate this website, but my configuration can be easily extended to
handle several different projects.
This website is generated from Emacs using M-x org-publish
(require 'ox-publish)
(defvar my/website-org-path "~/src/anschwa.github.io")
(defvar my/website-org-base-directory (concat my/website-org-path "/org/"))
(defvar my/website-org-publishing-directory (concat my/website-org-path "/public_html/"))
(defvar my/website-head-extra
(let ((viewport "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />"))
(concat viewport "\n")))
(setq org-html-metadata-timestamp-format "%Y-%m-%d")
(setq org-html-htmlize-output-type 'inline-css) ; Uses current theme for syntax highlighting
(setq org-publish-project-alist
`(
("website" :components ("website-content" "website-static"))
("website-content"
:base-extension "org"
:base-directory ,my/website-org-base-directory
:publishing-directory ,my/website-org-publishing-directory
:publishing-function org-html-publish-to-html
:recursive t
;; Disable some defaults
:html-link-home ""
:html-link-up ""
:html-head-include-default-style nil
:html-head-include-scripts nil
:html-preamble nil
:html-postamble nil
;; Custom options
:headline-levels 4
:language "en"
:html-html5-fancy t
:html-head-extra ,my/website-head-extra
:with-date t
:with-emphasize t ; *:t
:with-smart-quotes t ; *:t
:with-sub-superscript nil ; ^:nil
:with-toc nil ; toc:nil
:section-numbers nil ; num:nil
:html-preamble "<p>Published: %d</p>"
:html-postamble "<p>Last updated: %C</p>"
:html-wrap-src-lines t)
("website-static"
:base-directory ,my/website-org-base-directory
:publishing-directory ,my/website-org-publishing-directory
:base-extension "css\\|js\\|jpg\\|png\\|pdf"
:publishing-function org-publish-attachment
:recursive t)))