# /usr/bin/torunar

Cider: движок для блога на Markdown из bash и sed

Это второй (и заключительный) пост о том, как я отказался от 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 работает по следующему принципу:

  1. Сканируется папка с постами. Они должны быть распложены в следующей иерархии:

    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
    
  2. Каждый пост собирается с помощью компилятора Markdown от Daring Fireball.

    1. Заголовок поста берется из заголовка документа — содержимого первого элемента <h1> (#):

      # После компиляции это станет заголовком поста
      
    2. Краткое описание формируется из текста, заключенного между элементами <hr> (* * *):

      * * *
      После компиляции это станет кратким описанием поста
      * * *
      
    3. Текст поста — остальное содержимое документа.

    4. Дата публикации поста и его slug определяются на основе пути в папке с постами — YYYY/MM/DD и i-can-has-cheezburger.

    Все эти данные вставляются в соответствующие шаблоны темы — таким образом формируются страница просмотра поста, индексные страницы со списками постов и элементы для карты сайта.

Пока на Cider сделан всего один блог — мой, поэтому движком реализуется лишь та функциональность, что была восстребована на период написания этого поста.