Знакомство с 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.
О тэгах будет рассказано позднее.