Jekyll & Github - Excerpts как в WordPress

Ужас-то какой! Начнём с того, что Github предлагает нам древние версии Jekyll, Liquid и остального gem’усора

Jekyll – и есть генератор файлов, который используется для генерации статичных страниц данного блога – всех его страниц.

Liquid – движок темплейтов, позволяющий стыковать, обрабатывать, подготавливать и совершать иного рода процессинг информации для последующей передачи последней самому Jekyll, который уже и раскидывает получившиеся файлы как необходимо.

По факту, Liquid это всё, что есть для управления, для динамической генерации на стороне сервера.

Однако даже в последней версии он, без плагинов, достаточно прост и даёт крайне мало возможностей. Хотя надо признать что их вполне хватает для многих задач.

Увы, версия, что мы имеем на Github.pages, ограничена ещё более. Ухудшает положение ещё и тот факт, что мы не можем использовать и добавлять свои плагины. “Делайте что хотите” – ага.

Excerpts

Первая задача – реализовать возможность добавления обрезки содержимого с добавлением кнопки “читать дальше”. Банально, надо чтобы контент сплитился на две части: до <!-- more --> и после.

Однако, после получения текста, его надо как-то разделить. Liquid даёт фильтр split – то, что надо! Увы, этого фильтра нет в поставке Liquid в Github.pages. Проблема в том, что иных инструментов мы не имеем.

В сети люди используют 3 варианта.

Excerpts используя значение в YAML Front Matter

--
title: Reasons, decisions
excerpt: "This is why we can't get nice things."
--
Lorem Ipsum...

Хороший вариант если вы слабо заботитесь о людях, которые не так часто читают ваш сайт/блог. В YAML можно поместить любой текст, конечно, но это не так красиво, требует иметь ввиду необходимость в отступе при указании мульти-лайн строк и иметь ввиду что текст не препроцессируется, так что придётся пропускать его через фильтр markdownify.

Кроме того, если вы сделаете где-то в YAML ошибку, то Jekyll промолчит, а Github просто не сообщит о том, что страница сбилдилась, а так как такие сообщения со временем игнорируешь, удаляешь пачками, да и не ждёшь, ведь они приходят через пару минут после пуша, то можно попасть в такую ситуацию, что вроде как ты запостил новую страницу, но она просто не появится, а ты даже об этом и не узнаешь! Спасибо флагу --auto.

Однако, если вам хочется показывать на главной только совсем краткую информацию о содержимом поста/статьи, то этот вариант идеален.

Мне он совсем не подходит.

Excerpts используя Jekyll-плагин

Не подходит по понятным причинам – Github не предоставляет возможности использовать свои плагины. Тем не менее, это самый правильный вариант. Пример решения используя Jekyll-плагин.

Excepts через truncate

Oh humanity! Никогда не делайте так.

Почему? А что, если вы сделаете truncate на N слов, но в статье окажется, например N + N / 10 слов? Читатель будет сильно огорчён что ради пары последних строк ему пришлось делать лишние движения мышью. Он об этом может и не подумать, но осадок останется.

Единственный вариант – использовать для шаринга или чего-либо ещё, где в любом случае придётся делать truncate, так как даже самое короткое описание статьи редко уместится в ограничения, которые ставят всякие “вконтакты”.

Excerpts используя фантазию

Когда самые чистые варианты не подходят, приходится думать как сделать всё из ничего, используя грязные и не очень хаки.

В сети гуляет один любопытный метод, основанный на идее использования фильтра replace дабы дополнительный контент(после “читать далее”) оказывался в виде html-комментария: дополнительный контент находится между двумя комментариями, в первом комментарии удаляется закрывающий тег, а в последнем – открывающий тег. Так получалось что всё, что было между ними, оказывается в теле комментария:

До:

excerpt <!-- start --> content <!-- end -->

После:

excerpt <!-- start content end -->

Однако, для этого следовало указывать комментарий для начала и комментарий для кнца - не самый красивый вариант.

Excerpts используя фантазию: моя версия

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

Мы просто обрезаем закрывающий тег комментария и добавляем в конец -->. Красиво и просто!

Так как у меня используется более изменённый вариант, использующий хак для препроцесинга и не только, то думаю следует здесь указать код для сей идеи, очищенный от лишнего. Вдруг кому пригодится, на время до обновления Liquid в Github?

% if post.content contains '<!-- more -->' %
     content | replace: "<!-- more -->", "<!-- more" | append: "-->" 
% else %
     content 
% endif %

Брекеты сами добавьте где нужно. Увы, текущая версия Liquid не поддерживает и тег raw, который позволил бы постить код как есть.

Этот вариант я и использую на момент написания статьи.

Written on January 7, 2013