ruby - Jekyll 在 frontmatter 中错误的日期识别

标签 ruby date yaml jekyll

我最近开始尝试使用 Jekyll(v 3.0.1,在 Ubuntu 上使用 Ruby 2.2.3p173),我不确定我是否发现了错误或者它是某种 PEBKAC。

我有几篇文章,我想使用它们在 frontmatter 中定义的“日期”值进行排序,如下所示:

---
title: Whatever
category: foo
date: 2014-09-7
---

我一直在使用以下 Liquid 标签来生成排序的集合:

{% assign sorted=site.pages | where: 'category', include.category | sort: 'date' %}

它工作正常,但当我添加文章时,Jekyll 突然崩溃并显示以下错误消息:

“Liquid 异常:Liquid 错误:Jekyll::Page 与 Jekyll::Page 的比较失败(文件名)”

经过大量试验,我编写了一个自定义插件,但它仍然无法正常工作。然而,检查集合后发现日期属性的值有时会神奇地转换为日期对象,但大多数情况下它是一个字符串。

下面是我想不通的部分。

“2015-12-10”有什么特别之处?

“2015-12-9”仍然是一个字符串,“但是”2015-15-10“变成了一个日期对象。实际上,如果月份和日期都是两位数,Jekyll 就会崩溃.

有趣的是,如果我通过引用日期值修改了有问题的 frontmatter,它会按预期开始工作:

---
title: Whatever 2
category: foo
date: "2015-12-15"
---

我在这里错过了什么?

最佳答案

Jekyll 如何看待 front matter 值?

dates:
  - "2015-12-21" # String
  - 2015-12-21   # Date
  - 2015-12-1    # String
  - 2015-12-01   # Date
  - 2015-12-21 12:21:22  # Time
  - 2015-12-21 12:21:22 +0100 # Time

排序字符串

如果您将“日期”排序为 date: "yyyy-mm-dd" 并混合使用 date: "yyyy-mm-d" 这样的“日期”,这将失败。

---
datesAsStrings:
  - "2015-12-1"
  - "2015-12-3"
  - "2015-12-12"
---
{% assign sortedDates = page.datesAsStrings | sort %}
{% for date in sortedDates %}<p>{{ date }}</p>{% endfor %}

返回:

2015-12-1
2015-12-12
2015-12-3

日期排序

如果您对有效日期 (yyyy-mm-dd) 进行排序,则排序正常。

---
datesAsDates:
  - 2015-12-01
  - 2015-12-03
  - 2015-12-21
---
{% assign sortedDates = page.datesAsDates | sort %}
{% for date in sortedDates %}<p>{{ date }}</p>{% endfor %}

返回:

2015-12-01
2015-12-03
2015-12-21

炸毁它

如果将日期 (yyyy-mm-dd) 与字符串 (yyyy-mm-d) 混合使用

mixed:
  - 2015-12-1
  - 2015-12-03
{% assign sortedDates = page.mixed | sort %}
{% for date in sortedDates %}<p>{{ date }}</p>{% endfor %}

Error: Liquid error: comparison of String with Date failed

或与时间(yyyy-mm-dd hh:mm:ss)

---
datesAsDatesOrTime:
  - 2015-12-01
  - 2015-12-03 12:12:12 +0100
---
{% assign sortedDates = page.datesAsDatesOrTime | sort %}
{% for date in sortedDates %}<p>{{ date }}</p>{% endfor %}

Error: Liquid error: comparison of Date with Time failed

这与您在对具有不同日期类型的页面进行排序时遇到的问题相同。

结论

  • 在前面,Jekyll 的有效日期mydate: yyyy-mm-dd不是 mydate: "yyyy -mm-dd"mydate: yyyy-mm-d
  • 您只能对相同类型的元素进行排序。
  • 您只能根据具有相同类型的变量对页面、帖子或集合进行排序。

关于ruby - Jekyll 在 frontmatter 中错误的日期识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34386805/

相关文章:

javascript - 如何使用 Cucumber\Ruby\PageObject 从浏览器 JavaScript 全局变量中获取值?

jquery - 'jquery-rails' 和 'jquery-ui-rails' 可以在一个项目下管理吗?

r - 如何在R中找到日期的 "origin"

python - 返回具有日期范围的数据框

Ruby解析JSON.load和YAML.load生成不同的 key 类型

ruby-on-rails - 如何在 Windows 中为 Ruby on Rails 配置 Apache 2.2?

mysql - 如何获取仅在 dob 列中具有匹配月份和年份的那些人的 ID

amazon-web-services - 使用 cloudformation yaml 在 Lambda 函数上添加 S3 触发器

azure - 在 Azure 构建管道的整个阶段中保留对 defaultWorkingDirectory 的更改

ruby - 在 Ruby 中,如何通过 Sinatra 获取 `li` 标记内的链接?