Веб-страничка Дмитрия Кашина

Создание сайта при помощи Emacs Muse

Русский / English

Что такое Emacs Muse?

Emacs Muse - это публикатор, развиваемый проектом GNU. Принцип работы такой: Вы пишете статью с простенькой разметкой, затем командуете "опубликуй это!", он смотрит какие статьи в текущем проекте изменились за последнее время, и в соответствии со стилями создаёт документы в другом формате, пригодном для публикации.

Таким образом при помощи публикатора можно получить прекрасный веб-сайт, если Вы ничего не имеете против статики.

Как использовать?

Как и большинство программ проекта GNU, Emacs Muse поставляется с прекрасной документацией в формате Info, которая всегда доступна в Emacs через горячие клавиши C-h i. Если Ваш дистрибутив распространяет Muse без документации, как например в моём случае с Debian, то Вы можете скачать её с официального сайта и установить её в систему командой от имени суперпользователя:

# ginstall-info muse.info.gz /usr/share/info/dir

Перед тем, как начать делать сайт, я бы рекомендовал прочитать главы документации про проекты и стили. Изучение разметки можно оставить на потом, и воспользоваться файлом QuickStart.muse (в Debian его можно найти тут: /usr/share/doc/muse-el/examples/QuickStart.muse)

Стили

Итак, у вас файл QuickStart.muse, в котором содержится статья. Вы бы хотели оформить его в виде html-странички. Чтобы сделать это, надо всего-лишь нажать горячие клавиши C-c C-t и дать указание применить стиль html. В результате вы получите .html-файл со статьёй.

Однако, разумеется, оформление пока очень простое. Чтобы создать собственное оформление, надо определить новый стиль, производный от html. В примере ниже определяется новый стиль, отличающийся от базового лишь головняком и обувкой1, представляющими из себя каркас будущего сайта.

(muse-derive-style "freehck.ru-html" "html"
		   :header "~/prog/muse/freehck.ru/header.tmpl"
		   :footer "~/prog/muse/freehck.ru/footer.tmpl")

Сам каркас написать довольно просто. Для начала нужно определиться с дизайном сайта. Если вы хороший верстальщик, том можно сделать его самостоятельно. Я же по совету Алексея Отта2 воспользовался бесплатными шаблонами с сайта Andreas Viklund.

Чтобы разрезать шаблон на головняк и обувку, очень удобно воспользоваться html-mode. При этом надо иметь в виду, что когда Muse формирует статью в соответствии со стилем, он просматривает её содержимое на предмет наличия дополнительных тегов. Самым полезным кажется тег <lisp>, который позволяет выполнить произвольное S-выражение и подставить результат его вычисления в код. Примеры использования данной конструкции можно посмотреть в моих файлах header.tmpl и footer.tmpl.

Проекты

Для большего удобства можно объединять файлы в группы, и публиковать их все сразу, доверяя Muse отслеживать изменения в них. Такие группы называются проектами.

Документация по проектам короткая и понятная. Если коротко, то список проектов выглядит следующим образом:

(PROJECT-NAME (SOURCES)
  OUTPUTS)

PROJECT-NAME задаёт имя проекта, SOURCES - список директорий, где лежат .muse-файлы, а OUTPUTS - списки, описывающие что куда публиковать и в каком стиле. Если вы намерены использовать множество вложенных каталогов, то очень удобно будет воспользоваться функциями muse-project-alist-dirs и muse-project-alist-styles, которые сами обойдут дерево каталогов и сформируют вышеперечисленные параметры за вас. Вот как это делается:

(setq muse-project-alist
      `(("freehck.ru" (,@(muse-project-alist-dirs "~/prog/muse/freehck.ru/source") :default "index")
	 ,@(muse-project-alist-styles "~/prog/muse/freehck.ru/source"
				      "~/prog/muse/freehck.ru/html"
                                      "freehck.ru-html"))))

Код

Написанное выше задаёт направление движения, однако для того, чтобы довести проект до конца потребуется ещё много усилий. Особенно в плане lisp-вставок. Признаюсь, я пока не очень опытен в elisp, но поигравшись, я написал несколько очень полезных функций, которые помогут вам сэкономить время.

muse-file-relative-path - возвращает путь от текущего файла проекта до указанного.
muse-current-file-relative-path - возвращает путь от корня проекта до текущего файла.

Я использую два языка для своего сайта. В корне проекта есть две директории: en и ru. По имени первой директории относительного пути у меня определяется язык текущего файла проекта.

muse-detect-language - определяет язык текущего файла.
muse-another-language-relative-path - возвращает относительный путь до того же файла на другом языке.
muse-gen-locale-date - совершает в строке даты замену имен месяцев на те, что указаны в символе months-translation в соответствии с языком.

(setq months-translation
      '(("ru" . (("January" . "января")
		 ("February" . "февраля")
                 ...
		 ("November" . "ноября")
		 ("December" . "декабря")))))

Чтобы обеспечить поддержку многоязыкового меню, я написал функцию muse-generate-menu, которая формирует меню на основе переменной freehck.ru-menu.

(setq freehck.ru-menu '(("ru" . ( ("index.html" . "Главная")
			       ("articles/index.html" . "Статьи")
                               ("about.html" . "Обо мне")))
                     ("en" . ( ("index.html" . "Main")
			       ("articles/index.html" . "Articles")
			       ("about.html" . "About Me")))))

Все эти функции вы можете взять из моего файла muse-config.el.

Я думаю, что это ещё не конец, и впереди будут некоторые доработки кода, а также я размещу здесь свой git-репозиторий.

Заметки

1. досл. "header and footer"

2. Было бы несправедливо не упомянуть человека, вдохновшего меня на написание данной статьи - Алексея Отта, и его довольно неплохую статью о том, как он создавал свой сайт. В данной же статье я описываю свой собственный опыт использования Emacs Muse, а потому она не является производной от статьи Алексея и не нарушает условия лицензии CC BY-NC-ND 3.0, под которой опубликована статья Алексея.

Последние изменения: 7 Октябрь 2014