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'
。
因此:
- 我什至可以在
where_exp
表达式中使用过滤器(管道)吗?
- 如果不是,那么 - 我能否以某种方式将 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" %}
我正在使用 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'
。
因此:
- 我什至可以在
where_exp
表达式中使用过滤器(管道)吗? - 如果不是,那么 - 我能否以某种方式将 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" %}