суббота, 21 ноября 2009 г.

restas-directory-publisher

Выложил на github restas-directory-publisher - плагин для RESTAS, который позволяет публиковать директории. Поддерживается функциональность аналогичная mod_autoindex (Apache) и директиве DirectoryIndex (Apache).

Пример использования.

Я имею архив различной документации в несколько гигабайт, которую собирал несколько лет. Ранее я публиковал её через Apache (у меня также есть самописный файл index.html, в котором прописаны ссылки на все документы), но теперь так сложилось, что на моей домашней машине Apache больше ни для чего другого не используется и я решил, что хватит, пора переходить на Common Lisp решение. В итоге, Apache был выкинут, а его место занял hunchentoot, точнее RESTAS, вот весь код:
(asdf:operate 'asdf:load-op '#:restas-directory-publisher)

(restas:defsite #:homesite
(:use #:cl #:iter))

(in-package #:homesite)

(restas:define-site-plugin devdoc (#:restas.directory-publisher)
(restas.directory-publisher:*baseurl* '("devdoc"))
(restas.directory-publisher:*directory* #P"/path/to/devdoc/"))

(restas:define-site-plugin books (#:restas.directory-publisher)
(restas.directory-publisher:*baseurl* '("books"))
(restas.directory-publisher:*directory* #P"/path/to/books/"))

(restas:start-site '#:homesite :port 8080)

Параметры

Для настройки модуля сейчас можно использовать следующие переменные (все из пакета '#:restas.directory-publisher):
  • *baseurl* - базовый url, по которому публикуется директория
  • *directory* - путь (pathname) к публикуемой директории
  • *directory-index-files* - список Index файлов, по-умолчанию '("index.html" "index.htm")
  • *autoindex* - следует ли автоматически генерировать autoindex, если в директории нет Index-файлов, по-умолчанию t.
  • *autoindex-template* - функция, используемая для отображения autoindex. По-умолчанию - 'restas.directory-publisher.view:autoindex (генерирует autoindex в стиле lighthttpd). Кстати, эта функция определена с помощью cl-closure-template - можно рассматривать в качестве пример использования данной библиотеки :)
Обращаю внимание, что при указании значения переменных внутри макроса define-site-plugin используется динамическое связывание во время обработки запроса, так что один и тот же плагин можно использовать в рамках одного сайта несколько раз с разными параметрами. Примечательно, что код самого плагина об этом ничего не знает и пишется так, как будто он используется глобально. Получаем с одной стороны простоту разработки, а с другой достаточно гибкие возможности повторного использования.

Продвинутое использование

В поставку также входит функция restas.directory-publisher.view:autoindex-content, которую можно использовать для настройки переменной *autoindex-template* - данная функция генерируется только таблицу, а не законченный html. Она может пригодиться для адаптации генерируемого autoindex под внешний вид сайта (на котором используется данный плагин). Использовать эту возможность можно следующим образом:
(defclass homesite-plugin-instance (restas:plugin-instance) ())

(defmethod restas:adopt-route-result ((inst homesite-plugin-instance) (content string))
;;;; здесь встройка content в общий шаблон сайта
...)

(restas:define-site-plugin devdoc (#:restas.directory-publisher homesite-plugin-instance)
(restas.directory-publisher:*baseurl* '("devdoc"))
(restas.directory-publisher:*directory* #P"/path/to/devdoc")
(restas.directory-publisher:*autoindex-template* 'restas.directory-publisher.view:autoindex-content))

Комментариев нет:

Отправить комментарий