Как я могу сравнить размер/длину строки в шаблонах Jekyll's Liquid?

Я использую Jekyll на страницах GitHub для создания блога и хочу, чтобы длина строки page.title передавалась шаблону Liquid во вступительной части YAML в каждом сообщении. Я не смог найти простой способ сделать это. Изучив Руководство по Liquid For Designers, я увидел, что оно поддерживает два вида разметки:

  • Разметка вывода. Разделенные двойными фигурными скобками {{ }}, вы можете выводить переменные, которые передаются в ваш шаблон, либо во вступительной части YAML, например page.title в Jekyll, либо в глобальных переменных уровня сайта в _config.yml. Чтобы вывести заголовок сообщения или страницы, вы должны использовать {{ page.title }}.

  • Разметка тегов – разделены фигурными скобками и процентами {% %}, они используются для логики в ваших шаблонах. Если операторы, циклы и тому подобное.

По-видимому, есть много фильтров, которые вы можете использовать с выходной разметкой, и вы можете вывести длину строки, переданной в шаблон, с помощью {{ page.title | size }}.

Однако то, что я хотел бы сделать в своем шаблоне, — это отобразить заголовок страницы, используя заголовок <h1>, <h2> или <h3> в зависимости от длины заголовка.

Я все равно не могу понять, как смешать разметку тега и разметку вывода.

Я могу вывести размер page.title на страницу с {{ page.title | size }}, однако я не могу понять, как использовать длину в операторе if. Это также возвращает строковое представление, а не число.

Кто-нибудь, у кого больше опыта работы с Liquid, знает, как это сделать?

В идеале я хотел бы сделать что-то вроде этого:

{% if page.title | size > 5 %} 

person Cory Gross    schedule 26.05.2013    source источник


Ответы (5)


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

{% assign thesize = variable.size %}
{% if thesize > 5 %}
    Do stuff here.
{% endif %}

По крайней мере, работает для того, что я делаю, просто подумал, что выброшу его там. У меня были проблемы с использованием захвата из-за того, что он автоматически сохраняется в виде строки.

Тогда снова,

{% if variable.size > 5 %}
      Do stuff here.
{% endif %}

тоже должны работать одинаково.

person Connor Spencer Harries    schedule 05.12.2014

Я собираюсь опубликовать это решение, которое я нашел в чьем-то блоге. Это единственный способ, который я нашел до сих пор, чтобы безопасно получить длину переданной строки и сравнить ее, используя что-либо, кроме прямого равенства. Чтобы сделать сравнение, вы должны сделать вычитание и использовать разницу. Этот метод описан в этом блоге. сообщение, написанное Беном Данлэпом. Это все еще своего рода обходной путь, но он умный и кажется, что он всегда будет работать. Может быть не так эффективно, если вы хотите сделать if, elsif, else с несколькими предложениями, но вы все равно можете взять несколько различий и заставить их работать. В основном вы бы сделали это в моем случае:

{% capture difference %}{{ page.title | size | minus:20 }}{% endcapture %}

{% unless difference contains '-' %}        // 20 characters or less
  <h3>{{ page.title }}</h3>                 // show smaller header
{% else %}                                  // More than 20 characters
  <h2>{{ page.title }}</h2>                 // show larger header
{% endunless %}

Вид умный, но и своего рода хак. Если кто-то придумает лучший способ, дайте мне знать.

person Cory Gross    schedule 27.05.2013
comment
Это очень уродливое решение, но оно работает так, как ожидалось, так что это хороший ответ. - person Markus Amalthea Magnuson; 17.01.2016

Вы хотите сначала зафиксировать значение в переменной:

{% capture title_size %}{{ page.title | size }}{% endcapture %}

{% if title_size > 5 %}
  // do your stuff here...
{% endif %}

capture подробно описан в самом низу этой страницы: https://github.com/shopify/liquid/wiki/liquid-for-designers

person J W    schedule 26.05.2013
comment
Признаюсь, я проглядел тег capture. Это похоже на то, что я хочу. Однако это по-прежнему не работает, потому что фильтр size возвращает строку, выдает ошибку и не будет строиться при сравнении с числом. - person Cory Gross; 27.05.2013
comment
@CoryGross size не возвращает строку, но capture делает ее строкой… ;-) - person Nicolas Hoizey; 13.09.2017

В качестве примечания, сравнение длины также работает:

{% if site.posts.length > 0 %}
  blablabla...
{% endif %}
person Dorian    schedule 26.10.2014

Хотя нет очевидного способа преобразовать строку в целое число в шаблоне Liquid, вы можете сделать это наоборот (то есть преобразовать целое число в строку), используя тег {% capture %}, который просто выводит целочисленную переменную. Это связано с тем, что захват всегда возвращает фунт стерлингов.

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

Это не решает проблему этого вопроса, но достаточно полезно для всех, кто смотрит здесь, поэтому я все равно опубликую его. В этом примере мы хотим сравнить длину заголовка страницы с размером массива. Не спрашивайте почему :)

{% capture title_size %}{{ page.title | size }}{% endcapture %}

{% if title_size == some_array.size %}
    This will never be reached, because some_array.size is an integer and title_size a string
{% endif %}

{% capture some_array_size_str %}{{ some_array.size }}{% endcapture %}

{% if title_size == some_array_size_str %}
    But this will!
{% endif %}
person Markus Amalthea Magnuson    schedule 19.01.2014