dimayakovlev.ru


Как использовать Liquid-код в переменных Jekyll

Автоматическая обработка блоков 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, что добавляет гибкости в процессе работы над веб-сайтом и избавляет от необходимости увеличивать количество вариантов шаблонов оформления для разных типов страниц.