如何在Jekyll的Liquid模板中比较字符串的大小/长度?

Cor*_*oss 8 template-engine github liquid jekyll

我在GitHub页面上使用Jekyll来构建一个博客,并希望page.title在每个帖子中获取传递给YAML前端内容中的Liquid Template 的字符串的长度.我还没有找到一个简单的方法来做到这一点.看看Liquid For Designers Guide我能够看到它支持两种类型的标记:

  • 输出标记 - 由双花括号分隔{{ }},您可以输出传递给模板的变量,可以是YAML前端物质(如page.titleJekyll)或全局站点级变量_config.yml.要输出您要使用的帖子或页面的标题{{ page.title }}.

  • 标记标记 - 由花括号和百分比分隔,{% %}用于模板中的逻辑.如果语句,循环,那种类型的东西.

显然,有许多过滤器可以与输出标记一起使用,您可以使用输出传递给模板的字符串的长度{{ page.title | size }}.

不过,我想在我的模板做的是使用渲染的任何页面的标题<h1>,<h2><h3>取决于标题的长度头.

无论如何,我无法弄清楚标记标记和输出标记的混合.

我可以输出page.title页面的大小{{ page.title | size }},但我不能弄清楚如何在if语句中使用长度.这也返回字符串表示而不是数字.

有没有更多Liquid经验的人知道怎么做吗?

理想情况下,我想做的是这样的事情:

{% if page.title | size > 5 %} 
Run Code Online (Sandbox Code Playgroud)

Con*_*ies 20

我一直在研究使用液体语法在我的页脚中做链接,这很简单.

{% assign thesize = variable.size %}
{% if thesize > 5 %}
    Do stuff here.
{% endif %}
Run Code Online (Sandbox Code Playgroud)

至少在我正在做的事情上工作,只是想我会把它扔出去.我有使用捕获的问题,因为它自动存储为字符串.

然后,

{% if variable.size > 5 %}
      Do stuff here.
{% endif %}
Run Code Online (Sandbox Code Playgroud)

也应该平等地工作.


Cor*_*oss 10

我将在某人的博客上发布我发现的解决方案.到目前为止,这是我发现的唯一方法是如此安全地获取传入字符串的长度并使用除直接相等之外的任何其他方式进行比较.为了进行比较,你必须进行减法并使用差异.Ben Dunlap撰写的这篇博文中概述了该方法.它仍然是一种解决方法,但它很聪明,似乎总是有效.如果你想做一个if,elsif,其他有多个子句,可能效率不高,但你仍然可以采取多种差异并使其有效.基本上你会在我的情况下这样做:

{% 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 %}
Run Code Online (Sandbox Code Playgroud)

有点聪明,但也有点黑客.如果有人想出更好的方式让我知道.


J W*_*J W 7

您想首先捕获变量中的值:

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

{% if title_size > 5 %}
  // do your stuff here...
{% endif %}
Run Code Online (Sandbox Code Playgroud)

capture详情请见本页最底部:https: //github.com/shopify/liquid/wiki/liquid-for-designers

  • 我承认我忽略了`capture`标签.这看起来像我想要的.但是,这仍然不起作用,因为`size`过滤器返回一个字符串,它会抛出错误,并且在与数字进行比较时不会构建. (4认同)

Dor*_*ian 5

附带一提,长度比较也可以:

{% if site.posts.length > 0 %}
  blablabla...
{% endif %}
Run Code Online (Sandbox Code Playgroud)