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