9

我在 GitHub Pages 上使用 Jekyll 来构建博客,并且希望page.title在每篇文章的 YAML 前文中获取传递给 Liquid 模板的字符串长度。我还没有找到一个简单的方法来做到这一点。查看Liquid For Designers Guide我可以看到它支持两种类型的标记:

  • 输出标记- 由双花括号分隔{{ }},您可以输出传递给模板的变量,可以是page.title在 Jekyll等 YAML 前端,也可以是_config.yml. 为了输出您将使用的帖子或页面的标题{{ page.title }}

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

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

但是,我想在我的模板中做的是使用 , 或标题来呈现页面的标题,<h1>具体<h2>取决于<h3>标题的长度。

无论如何我都想不出混合标签标记和输出标记。

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

有没有对 Liquid 有更多经验的人知道如何做到这一点?

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

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

5 回答 5

23

我一直在研究这个使用流动语法在我的页脚中做链接的方法,它非常简单。

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

至少适用于我正在做的事情,只是想我会把它扔在那里。我在使用捕获时遇到问题,因为它会自动存储为字符串。

再说一次,

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

也应该同样有效。

于 2014-12-05T17:54:25.467 回答
10

我将发布我在某人的博客上找到的这个解决方案。这是迄今为止我发现的唯一一种安全地获取传入字符串的长度并使用除直接相等之外的任何东西进行比较的方法。为了进行比较,您必须进行减法并使用差异。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 %}

有点聪明,但也有点骇人听闻。如果有人想出更好的方法,请告诉我。

于 2013-05-27T01:36:35.653 回答
7

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

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

于 2013-05-26T20:37:45.570 回答
6

作为旁注,长度比较也有效:

{% if site.posts.length > 0 %}
  blablabla...
{% endif %}
于 2014-10-26T20:44:19.970 回答
3

尽管在 Liquid 模板中没有明显的方法可以将字符串转换为整数,但您可以通过使用{% capture %}仅输出整数变量的标记来以相反的方式进行(即将整数转换为字符串)。这是因为捕获将始终返回一个 stering。

考虑到这一点,你实际上可以欺骗 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 %}
于 2014-01-19T17:05:21.027 回答