Cider: движок для блога на Markdown из bash и sed
2017/02/22Это второй (и заключительный) пост о том, как я отказался от Tumblr в пользу генераторов статических сайтов.
В прошлом посте я рассказывал, как экспортировал свой блог и свалил в закат.
После экспорта у нас было 65 постов в Markdown, 75 папок с картинками, пять цитат и диалогов, полсолонки GitHub Pages и целое множество мелких движков для блогов всех сортов и расцветок, Sculpin, а также Jekyll, Hugo, ящик blogc, пинта чистого Sphinx и две дюжины других решений. Не то чтобы это был необходимый запас для блоггинга, но если начал собирать дурь, становится трудно остановиться. Единственное, что вызывало у меня опасение — это самописные системы. Ничто в мире не бывает более беспомощным, безответственным и порочным, чем зомби-красноглазики. Я знал, что рано или поздно мы перейдем и на эту дрянь.
Изначально я хотел держать блог на Bitbucket Pages, но этот вариант отпал почти сразу по двум причинам:
- Нет поддержки Jekyll из коробки — собирать страницы придется самостоятельно.
- Нет возможности привязать свой домен — придется сидеть с адресом вида torunar.bitbucket.io.
Передо мной стоял выбор: использовать GitHub Pages или же взять какой-нибудь генератор статических сайтов и хостить все на своем сервере. В этот момент в моей голове проснулся Упоротый лис и сказал: «Эй, чувак, ты не хочешь использовать готовые решения на Ruby, Python или PHP. Ты хочешь написать движок под свои нужды. Hа bash». Я понимаю, насколько дико это все звучит, но мне действительно пришла в голову мысль написать шаблонизатор на базе консольных утилит (find, grep, sed и т.д.) и выстроить вокруг него движок для блога, писать посты в Markdown и компилировать их в HTML.
В результате на свет родился блоговый движок Cider. Название выбрано неслучайно: кто же будет пользоваться таким на трезвую голову?
Cider работает по следующему принципу:
Сканируется папка с постами. Они должны быть распложены в следующей иерархии:
YYYY ├── MM │ ├── DD │ │ └── i-can-has-cheezburger │ │ └── index.md │ └── DD │ └── lol-limeware │ └── index.md └── MM └── DD ├── all-your-base │ └── index.md └── are-belong-to-us └── index.md
Каждый пост собирается с помощью компилятора Markdown от Daring Fireball.
Заголовок поста берется из заголовка документа — содержимого первого элемента
<h1>
(#
):# После компиляции это станет заголовком поста
Краткое описание формируется из текста, заключенного между элементами
<hr>
(* * *
):* * * После компиляции это станет кратким описанием поста * * *
Текст поста — остальное содержимое документа.
Дата публикации поста и его slug определяются на основе пути в папке с постами —
YYYY/MM/DD
иi-can-has-cheezburger
.
Все эти данные вставляются в соответствующие шаблоны темы — таким образом формируются страница просмотра поста, индексные страницы со списками постов и элементы для карты сайта.