Вообще говоря, шаблоны Liquid для Jekyll довольно просты в создании — Liquid является мощным шаблоном шаблонов и предлагает большое количество помощников и средств форматирования для выполнения сложных задач. Тем не менее, недавно у меня появилась возможность создать сайт, который требовал от меня использования техник, которые мне никогда не были нужны раньше с Liquid и Jekyll.
На домашней странице было несколько повторяющихся разделов, в которых перечислялся контент для каждой категории контента. Если контента не было, раздел не должен отображаться. Что еще более важно, каждый раздел был по сути одинаковым, за исключением некоторых категорий метаданных и стилей. Вместо того, чтобы повторять один и тот же код для каждого раздела, я решил использовать include — но это потребовало некоторых творческих обходных путей для демонстрации стиля.
В этом посте я покажу некоторые методы, которые я использовал. Я не совсем уверен, что это обязательно «лучшие практики», но, поскольку в Интернете было не так много информации, которую я мог найти, я подумал, что стоит поделиться. (И если у вас есть лучшие способы решения этих проблем, пожалуйста, поделитесь.)
Определение, есть ли у категории сообщения (и сколько)
Это на самом деле довольно просто. Каждая категория имеет свойство размера, которое вы можете использовать.
{% if site.categories.categoryname.size%}
<!-- do something -->
{% endif%}
Очевидно, замените categoryname
на фактическую категорию, которую вы использовали для своих сообщений. Не волнуйтесь, это не будет ошибкой, если категория не существует. Теперь, я полагаю, вы могли .size
бы отказаться, предполагая, что если категория не существует, то это потому, что она не содержит постов, но это работает так же хорошо (и, возможно, читается легче).
Присвойте значение переменной
В этом сценарии у меня была переменная, которая будет иметь текущую категорию. Назначить переменную легко. У жидкости есть assign
ключевое слово для этой цели.
{% assign categoryname = 'foobar'%}
В некоторых примерах утверждается, что вы не можете переназначить значение переменной после первоначального присвоения. Я не обнаружил, что это так. Однако вы также можете назначить переменную с помощью capture
.
{% capture categoryname %}foobar{% endcapture %}
Использование переменной с включенным
Здесь действительно нечего делать. Если переменная назначена, вы можете просто использовать ее в любом последующем включении. (Примечание. Я пытался использовать with
ключевое слово для передачи переменной в include, а не назначать ее каждый раз, но не смог заставить ее работать должным образом.)
Самое интересное в том, что include всегда был одинаковым, просто менялось значение переменной. Давайте посмотрим на небольшую часть.
{% if site.categories.foobar.size %}
{% assign categoryname = "foobar" %}
<section>
{% include index_article.html %}
</section>
{% endif %}
{% if site.categories.barbar.size %}
{% assign categoryname = "barbar" %}
<section>
{% include index_article.html %}
</section>
{% endif %}
В рамках этого включения (которое я плохо назвал index_article.html
) я могу перебирать сообщения в этой категории, используя переменную.
{% include banner.html %}
<ul class="ArticleList">
{% for post in site.categories[categoryname] %}
<li>
<h4><a href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a></h4>
<p>{{ post.description }}</p>
<p><span class="Author">{{ post.author }}</span>
<span class="PublishDate">{{ post.date | date: "%b %-d, %Y" }}</span></p>
</li>
{% endfor %}
</ul>
Динамически загружать данные
Итак, помните, я сказал, что баннер изменился в зависимости от метаданных какой-либо категории? Что ж, для этого я решил поместить необходимые элементы метаданных в файл данных YAML _data
. У каждой категории было то же ключевое имя, что и у фактической категории постов, так что я легко мог ее найти. (Да, это, вероятно, немного хрупко, но помните, что мы говорим о статическом сайте — я не собираюсь выдвигать что-то сломанное вживую.)
Давайте посмотрим на образец YAML.
foobar:
name: "Foo Bar"
description: "Foo is the best kind of bar around"
logo: "foobar.png"
color: "Purple"
barbar:
name: "Bar Bar"
description: "There's no doubt that bar is the original kind of bar"
color: "Orange"
Обратите внимание, что они не содержат одинаковые метаданные — у первого есть логотип, а у второго нет. В приведенном index_article.html
выше примере кода я включил banner.html
. Давайте посмотрим на это.
<div class="SectionHead {{ site.data.categories[categoryname].color }}Box }}">
<div class="LogoSpot">
{% if site.data.categories[categoryname].logo %}
<img src="{{ site.baseurl }}/images/{{ site.data.categories[categoryname].logo }}"
alt="{{ site.data.categories[categoryname].name }}"/>
{% elsif site.data.categories[categoryname].subtitle %}
{{ site.data.categories[categoryname].subtitle }}
{% else %}
{{ site.data.categories[categoryname].name }}
{% endif %}
</div>
<h2>{{ site.data.categories[categoryname].name }}</h2>
<h3>{{ site.data.categories[categoryname].description }}</h3>
</div>
Обратите внимание, что я могу динамически извлекать имя категории через переменную (и даже при том, что это включение во включении после того, как переменная была установлена). Также обратите внимание, что я могу проверить, существуют ли определенные свойства в категории — например, я показываю логотип, если он существует, если не подзаголовок (если он существует), а просто только название категории.
Вывод
Надеюсь, эти примеры полезны — я знаю, что они помогли бы мне. Если у кого-то есть предложения о том, как я мог бы добиться таких же результатов лучше, поделитесь.
Также обязательно ознакомьтесь с моей бесплатной электронной книгой от O’Reilly — Генераторы статических сайтов — Современные инструменты для разработки статических сайтов.