Andrey Prokopenko's Blog

Знакомство с Hakyll

Введение

Блог создан с помощью Hakyll, написанном на Haskell. У нас есть шаблоны, статьи в формате Markdown (хотя подойдёт в принципе всё что угодно), есть css-стили, js-скрипты и другие файлы. И мы хотим получить из этого статичный HTML, приправленный в меру стилями и скриптами. Почему статичный HTML? Да потому что это секьюрно, это модно и это молодёжно. Всегда удобнее закэшировать и отдавать статику, чем генерировать тонны запросов к базе даже в тех случаях, когда база в принципе не нужна, как, например, в этом.

Для простого блога вообще-то не нужна база данных, не нужен мощный веб-сервер, ориентированный в первую очередь на базу и в последнюю очередь на пользователя, который обращается к нему из браузера. Для простого блога достаточно отдавать контент единожды настроенным образом. Hakyll как раз и позволяет единожды настроить отображение статичных страниц.

Причём тому есть масса примеров.

Резонный вопрос: как наполнять блог контентом? Ответ прост и уже прозвучал: статьи будут в формате Markdown (хотя благодаря Pandoc подойти может всё что угодно).

Итак, ниже мы развернём Hakyll, создадим шаблон блога и пройдёмся по нему детальнее.

Установка hakyll

Просто достаточно выполнить эту команду:

Теперь можно завести шаблонный блог следующей командой (если hakyll-init не будет обнаружен, проверьте переменную $PATH и убедитесь, что путь к cabal прописан).

hakyll-init создаст директорию my-blog, затолкнёт в неё все нужные файлы, включая site.hs, который содержит всю необходимую конфигурацию для блога.

Давайте скомпилируем его и посмотрим на блог в браузере.

В STDOUT повалятся сообщения о том, что собственно сделано. А теперь для просмотра блога нужно передать сайту следующий аргумент:

и теперь можно переходить сюда для просмотра. Наслаждайтесь.

Структура блога

Директории и файлы

  • contact.markdown, about.rst и index.html - контент соответсвующих страниц.
  • css, images - ресурсы: стили, картинки, также можно добавить скрипты, да всё что угодно.
  • templates/* - шаблоны, из которых выстраивается единая и неделимая картинка.
  • posts/* - директория с блогозаписями.
  • _cache - кэш Hakyll.
  • _site - сюда Hakyll кладёт собранный из шаблонов, записей и ресурсов результирующий набор соответствующим их файлов.
  • site.hs - исходник программы, содержимого которого коснёмся чуть ниже.

Метаданные

Пытливый читатель мог натолкнуться на метаданные, например, в contact.markdown:

---
title: Contact
---

I live...

Метаданные нужны для параметризации блога. К примеру для динамического изменения заголовка страницы.

Конфигурация

Теперь мы перейдём к структуре конфигурации site.hs. Hakyll представляет три связанные между собой концепции:

  • правила;
  • маршруты;
  • компиляторы.

Правила описывают связи между маршрутами и компиляторами. Маршруты описывают отображение исходного заголовка файла (или родительской директории группы файлов) в директорию _site и правило наименования целевых файлов. А компиляторы описывают трансформацию содержимого файла. К примеру compressCssCompiler сжимает css-файл, удаляя переносы строки, лишние пробелы и т.п., а pandocCompiler осуществляет преобразования над md, rst файлами, транслируя их в html.

Hakyll - достаточно гибкий: он позволяет кастомизировать под себя как правила, так и маршруты с компиляторами.

Компиляторы

Отдельно следует коснуться компиляторов. Все связи между страницами, весь дизайн блога описывается шаблонами, которые могут вкладываться друг в друга. Причём компилятору можно как явно указывать последовательно шаблоны один за другим, так и описать все связи шаблонов неявно, а компилятору указать на родительский шаблон. Зависимые шаблоны он подтянет самостоятельно.

Помимо шаблона компилятору нужно указывать контекст, к которому следует применять шаблон. Контекст как раз и содержит метаданные (параметры, их значения содержатся в самих файлах). Т.е. можно один раз выделить параметры, которые будут фигурировать на всех однотипных страницах, задекларировать их и прикручивать контекст на шаблон.

Более подробно эти процессы описаны в туториалах Hakyll.

О тэгах будет рассказано позднее.


Posted on 2014-08-31 by agr . Powered by Hakyll. Inspired by Yann Esposito.