Автоматическая обработка блоков Liquid-кода, содержащегося в значениях переменных, могло бы значительно упростить разработку шаблонов и поддержку веб-сайтов на Jekyll. Не смотря на то, что ряд пользователей уже продолжительное время просит разработчиков о включении такой возможности в базовый функционал Jekyll, разработчики эти просьбы отклоняют. Но это не значит, что нельзя добавить такую возможность самостоятельно при помощи плагина.
Примером такого плагина поделился в своём блоге разработчик из Вьетнама Phạm Ngọc Hùng.
Чтобы понять, требуется ли именно вам применять это решение при работе над своим проектов веб-сайта в Jekyll, предлагаю рассмотреть простой пример с формированием заголовка страниц в Liquid-шаблоне.
<title>{{ page.title | escape }} - {{ site.title | escape }}</title>
Этот код жёстко задаёт формат, которому будут соответствовать заголовки страниц веб-сайта: название страницы из переменной page.title
, отделённое дефисом от названия веб-сайта из переменной site.tile
. Значения обеих переменных статичны и задаются вручную в соответствующих файлах - в файле страницы в блоке метаданных и в файле настроек веб-сайта _config.yml.
Это работает до тех пор, пока не возникает потребность изменить формат заголовков отдельных страниц, например, включить в них значения других переменных. В этом случае приходится или создавать новые шаблоны оформления страниц, или добавлять доплнительную логику проверки текущей страницы в уже существующий шаблон. Чтобы избавиться от неудобств, связанных с ростом количества вариантов шаблонов и усложнением их логики, удобно поместить блоки Liquid-кода в значения переменных, чтобы затем выводить в сформированный HTML-код страницы их вычисленные значения.
Именно этого позволяет добиться предлагаемое к рассмотрению решение в виде плагина для Jekyll.
Как это работает?
Для начала потребуется добавить свой плагин в проект веб-сайта. Для этого создайте текстовый файл по адресу: _plugins/expand_nested_variable_filter.rb. В созданный файл скопируйте следующий код на языке Ruby.
module Jekyll
module ExpandNestedVariableFilter
def flatify(input)
Liquid::Template.parse(input).render(@context)
end
end
end
Liquid::Template.register_filter(Jekyll::ExpandNestedVariableFilter)
Теперь в Jekyll будет доступен новый фильтр flatify
, который возвращает вычисленное значение переменной, содержащее блоки Liquid-кода.
Для применения фильтра к значению переменной page.title
из рассмотренного ранее примера шаблона оформления, требуется внести в него следующее изменение.
<title>{{ page.title | flatify | escape }} - {{ site.title | escape }}</title>
Теперь значение переменной page.title
будет обрабатываться фильтром flatify
, а значит в него можно включать блоки Liquid-кода, которые будут вычисляться при обработке.
title: Добро пожаловать на сайт {{ site.title }}!
При желании можно упростить шаблон, оставив в нём только переменную page.title
.
<title>{{ page.title | flatify | escape }}</title>
В этом случае шаблон текста для заголовка страниц будет определяться в самой переменной page.title
.
title: Как создать личный веб-сайт при помощи Jekyll. Цикл статей {{ site.author }} - {{ site.title }}
Фильтр flatify
можно применять как к переменным уровня страницы, так и к переменным других уровней, доступных в Jekyll, что добавляет гибкости в процессе работы над веб-сайтом и избавляет от необходимости увеличивать количество вариантов шаблонов оформления для разных типов страниц.