Abstract

The emacs org-mode is a simple, text markup based outliner and personal organizer with a bunch of features for creating extensively hyperlinked notes. By writing simply formatted text and exporting to HTML, you can create web sites. If combined with jekyll, it allows creation of a website with integrated blog. The best part is that no software is required server side, making the generated site virtually unhackable. Org-mode and jekyll compile the site to static html, and can be made responsive with css and javascript (e.g., bootstrap).

Introduction

My personal homepage http://www.hpcf.upr.edu/~humberto/ has for many years been generated with GTML, a static website generator that combines several tools. My version is ancient, and I’ve been wanting to update my (rather plain) website to a new style for some time, so I started looking around for alternatives.

I want my site to look nicer than the old one, so I started with bootstrap, a javascript library for creating good looking pages with minimal effort. To use bootstrap, you need to write your entire page in html. Writing plain html is a pain, so I searched for template languages that work with bootstrap. Jekyll is the site generator for github-pages, and works nicely with bootstrap. Jekyll supports various markup languages (principally markdown) out of the box, simplifying website generation.

I remembered an article on using org-mode and jekyll, and decided to try combining them for my site. It takes quite a bit of setup work, but the result is very flexible, and I think it looks quite nice.

Methods

I started by creating a jekyll site following the quickstart. Then I modified the default template to include bootstrap. At this stage, it’s convenient to use the jekyll serve command to test the site. Once the jekyll + boostrap is working, I created a directory for the org project. I moved the jekyll site into the project directory, and created an org directory parallel to the jekyll directory, as recommended in the tutorial.

The final step is to create a project file. I created a project.el file in the project directory, where I define the org-publish project. I had some trouble because the version of org complained about argument count mismatches. Following the instructions in this stack overflow post solved the issue.

(require 'ox-publish)
(require 'ox-html)
;(require 'org-publish)
(setq org-publish-project-alist
      '(

  ("org-humberto"
	  ;; Path to your org files.
	  :base-directory "~/src/web/test-org-jekyll/org/"
	  :base-extension "org"

	  ;; Path to your Jekyll project.
	  :publishing-directory "~/src/web/test-org-jekyll/jekyll/"
	  :recursive t
	  :publishing-function org-html-publish-to-html
	  ;; :headline-levels 4 
	  ;; :html-extension "html"
	  :body-only t ;; Only export section between <body> </body>
	  :with-toc nil ;; don't export toc, it clobbers the yaml front matter
    )

    ("org-static-hoz"
	  :base-directory "~/src/web/test-org-jekyll/org/"
	  :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf\\|php"
	  :publishing-directory "~/src/web/test-org-jekyll/jekyll"
	  :recursive t
	  :publishing-function org-publish-attachment)

    ("hoz" :components ("org-humberto" "org-static-hoz"))

))

After evaluating the above code, running C-c C-e pops up a page of export options, and selecting P, x exports a named project. This pulls all the org files from the org tree, and publishes html in the jekyll tree.

Results

The combination of org-mode, jekyll and bootstrap makes a simple website generator with lots of features. There are lots of other ways to do the same thing, but org-mode has a lot of smarts on the editing side, making life simpler for the writer (e.g., links are live in the markup language).

There are two features I still don’t know how to emulate in the new setup. GTML can define new macros, like:

define doi(uri) <a href="http://dx.doi.org/uri">doi: uri</a>

Jekyll allows includes and variables, but I’m not sure I can define a parametrized macro like the above. Fortunately, org-mode can provide the same functionality. Here’s org-mode’s version of macros:

#+MACRO: doi [[http://dx.doi.org/$1][doi:$1]]

The other feature I like about GTML is that it can generate a site index with all the files defined in the project, and next, previous and up links on each page. I know org mode can do the same, but I haven’t yet read how to do it and integrate into this site.