Jekyll 在 where_exp 中使用管道运算符

Jekyll using pipe operator in where_exp

我正在使用 Jekyll 3.8。我的帖子包含 date 属性集。其中一些包含过去的值(例如 2001-01-01),其中一些包含未来的值(例如 2109-12-31)。

我想要实现的是只显示过去的帖子(以便它们的日期小于 now)。现在,我已经设法使用:

完成了它
{% capture current_time %}{{'now' | date: '%s'}}{% endcapture %}

{% for post in site.posts %}
  {% capture post_time %}{{post.date | date: '%s'}}{% endcapture %}
  {% if post_time >= current_time %}
           DISPLAY THE ITEM
  {% endif %}
{% endfor %}

但效率不高。

我想使用 where_exp 过滤器完成它。现在 - 这可能吗? 我的草稿看起来像:

{% capture current_time %}{{'now' | date: '%s'}}{% endcapture %}
{% assign filtered_posts = site.posts| where_exp:"post","post.date | date: '%s' >= current_time" %}

{% for post in filtered_posts %}
   DISPLAY THE ITEM
{% endfor %}

但我收到 Liquid Exception: Liquid error (line 5): comparison of Time with String failed in source.md

我想,问题出在 {% assign filtered_posts = site.posts| where_exp:"post","post.date | date: '%s' >= current_time" %} 中的 | date: '%s'

因此:

  1. 我什至可以在 where_exp 表达式中使用过滤器(管道)吗?
  2. 如果不是,那么 - 我能否以某种方式将 post.date 转换为不带过滤器的字符串,或者将 current_time 转换为字符串并同时进行比较?

我无法重现您的错误,因为 where_exp 由于比较表达式中的管道而引发错误。

不过,您可以将时间对象 post.date 与 site.time(生成时间)进行比较,以获取过去的帖子。

{% assign filtered_posts = site.posts | where_exp: "post","post.date <= site.time" %}

我有一个类似的问题,我详细描述了in the Jekyll community forum。它是关于获取包括今天在内的未来事件列表,OP 的类似方法在这里也不起作用:

{% assign events_list = site.events | where_exp: "event", "event.date >= site.time | date: %F" %}

所以我在_plugins/to_time.rb中创建了一个filter plugin,它将字符串转换为时间对象:

module Jekyll
    module AssetFilter
        def to_time(date_string)
            DateTime.parse(date_string).to_time
        end
    end
end

Liquid::Template.register_filter(Jekyll::AssetFilter)

这首先将字符串解析为 DateTime 对象,然后使用 this to_time function 生成 Time 对象。

然后我用当前时间分配一个变量,用我需要的过滤器应用管道运算符,然后我在最后添加 to_time 过滤器:

{% assign today = 'now' | date: '%F' | to_time %}

使用 now,然后使用 %F 获取它的日期部分,然后将其转换回时间,因此 today 将是今天的日期 0:00早上。

然后我可以将它与我的事件集合项目中的 date 对象进行比较:

{% assign events_list = site.events | where_exp: "event", "event.date >= today" %}