Пилим уютный бложик на Emacs: Идея

В самом начале скажу, что я - не любитель пилить руководства, если у инструмента, о котором идет речь есть вменяемая документация на любом из языков, которым обучают в школе. Довольно забавно в 2017м году встречать все новые посты а-ля "Как установить Apache на Ubuntu". Цель этой серии постов - не научить тому, как это делается, а привлечь внимание сабжу и, может быть, заинтересовавшийся человек, дальше самостоятельно разберется с вопросом при помощи исчерпывающей документации по org-mode.

До нынешнего момента я менял блог раз в год или чаще на протяжении вот уже 5 с лишним лет. За это время я успел перебрать и Wordpress с прочими php-движками, и джангу, и на сегодняшний день могу с уверенностью сказать, что лучший опыт взаимодействия с блогом - генераторы статических сайтов.

Не буду долго рассказывать обо всем, что успел попробовать с тех пор, как попробовал Jekyll, скажу лишь, что все генераторы статических сайтов, которые мне попадались, были по-своему хороши, но у каждого из них свой круг почитателей, в который я по тем или иным причинам не попал. Кроме того, одним из аспектов, почему эту версию блога я решил пилить именно на Emacs с org-mode, стало то, что я не так уж часто выкладываю посты, но с удовольствием вожусь с самим блогом, а здесь в этом отношении - разгуляйся.

Я видел определенное количество блогов, полностью реализованных в Emacs, однако, как минимум, внешний вид большинства из них, производил если не отталкивающее впечатление, то уж точно возвращал в 90-е. Сам я тот еще дизайнер, однако, идея реализовать блог не выходя из редактора с приемлемым внешним видом, показалась мне интересным челленджем. Ну и, плюс ко всему, я имею слабость к лиспам. Не то, чтобы писать на Emacs Lisp сколько-нибудь сравнимо с той же Clojure или, на худой конец, Scheme, но отвлекает от PHP и других моих повседневных языков.

Надо сказать, что вполне неплохие по меркам емаксовых блогов экземпляры все же попадаются, например, этот блог о лиспе, smalltalk и вебе.

Итак, с предисловием покончено, можно рассказать о том, что же, собственно, должно быть реализовано и какими средствами:

Ну а теперь немного реализации того, о чем идет речь. В сети несложно найти примеры того, как преобразовать папку с org-файлами в набор html-файлов. Тем не менее, просто, чтобы информация была собрана в одном месте, положу сюда минимальный пример конфигурации.

(setq org-publish-project-alist
      `(("blog"
         :base-directory       "~/blog/posts/"
         :publishing-directory "~/blog/public/"
         :publishing-function  org-html-publish-to-html)))

Собственно, этого достаточно, чтобы M-x org-publish создал пачку html-файлов, соответствующих содержимому папки ~/blog/posts/.

Как следует из названия переменной, org-publish-project-alist - список проектов, предназначенных для публикации. Каждый проект, в свою очередь, тоже представляет из себя список, первым элементом которого является строка с названием проекта, а остальными элементами - пары ключ-значение. Учитывая отсутствие нормальных хешмапов в Emacs Lisp, абсолютно нормально положение ключей на четных элементах списка - извлечение производится конструкцией типа (plist-get (cdr project)).

Проекты могут объединять множество вложенных проектов, тогда они должны содержать свойство :components, являющееся списком, содержащим имена вложенных проектов в виде строк.

Подробнее об org-publish-project-alist можно почитать здесь, в доке по org-mode.

На этом достаточно подробное изложение того, что я хочу получить в итоге, можно считать исчерпанным и двигаться дальше.