2013-05-26 1 views
6

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

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

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

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

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

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

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

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

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

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

ответ

10

Я собираюсь опубликовать это решение, которое я нашел в чьем-то блоге. Это единственный способ, который я нашел до сих пор, так надежно получить длину переданного в строке и сравнить, используя что-либо иное, чем прямое равенство. Чтобы сделать сравнение, вы должны сделать вычитание и использовать разницу. Этот метод описан в этом документе blog post written by Ben Dunlap. Это все-таки своего рода обходной путь, но он умен и кажется, что он всегда будет работать. Не может быть так эффективно, если вы хотите сделать 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 %} 

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

+0

Это очень уродливое решение, но оно работает так, как ожидалось, так что это хороший ответ. –

6

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

{% 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

+4

Я признаю, что я упустил тег 'capture'. Это похоже на то, что я хочу. Тем не менее, это все еще не работает, потому что фильтр 'size' возвращает строку, и она выбрасывает и вызывает ошибки, и не будет строиться при сравнении с числом. –

+0

@CoryGross 'size' не возвращает строку, но' capture' делает ее строкой ... ;-) –

2

Хотя нет очевидного способа отбросить строку к целому числу в шаблоне 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 %} 
3

Как примечание стороны, длина comparaison также работает:

{% if site.posts.length > 0 %} 
    blablabla... 
{% endif %} 
15

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

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

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

Затем снова

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

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

Смежные вопросы