【发布时间】:2014-11-29 13:14:19
【问题描述】:
我创建了一个基于 Jekyll 的博客,主题为 jekyll-now。我是 Jekyll 及其运作方式的新手(尤其是 Liquid)。我知道新帖子需要如下:2014-10-04-Hello-World.md。但我真的不明白我怎么能订购这些。
我的第一个想法是他们按日期排序,所以同一日期的两个帖子会随机排序。但事实并非如此吗?有没有办法按时间顺序排列帖子。或者至少有一个帖子存档页面?
【问题讨论】:
我创建了一个基于 Jekyll 的博客,主题为 jekyll-now。我是 Jekyll 及其运作方式的新手(尤其是 Liquid)。我知道新帖子需要如下:2014-10-04-Hello-World.md。但我真的不明白我怎么能订购这些。
我的第一个想法是他们按日期排序,所以同一日期的两个帖子会随机排序。但事实并非如此吗?有没有办法按时间顺序排列帖子。或者至少有一个帖子存档页面?
【问题讨论】:
在 Jekyll 官方文档中有一个示例如何创建一个基本的帖子存档页面:
Displaying an index of posts
奖励:对于更漂亮的存档页面(按年或年/月分组),请参阅this answer。
你是对的,我在文档中找不到任何说明帖子如何排序的内容,但事实上 Jekyll 确实按时间顺序排列它们,最近的帖子在前(你如果您尝试我上面链接的示例,可以看到这一点)。
要以其他方式对它们进行排序(最旧的帖子优先),您可以使用reversed 关键字,根据Liquid documentation:
{% for post in site.posts reversed %}
但是,我不知道同一日期的两个帖子是如何排序的,因为我不写那么多帖子,所以我从来没有遇到过这个问题:-)
你必须自己尝试一下。
【讨论】:
刚刚遇到同样的问题并用这个解决方案解决了: https://groups.google.com/forum/#!topic/jekyll-rb/8QCIzevauSU
在帖子的 YAML Front Matter 中添加日期字段,如下所示:
date: 2010-09-15 14:40:45
例如如果您在 2014/12/31 有 2 个帖子,您可以将 date: 2014-12-31 00:30:00 添加到 latest_post.md,将 date: 2014-12-31 00:10:00 添加到 old_post.md。
如果需要,您可以添加时区(例如date: 2014-12-31 00:10:00 +08:00)
【讨论】:
我想在这篇文章中记录我的挣扎,以便对其他用户有所帮助。您需要做两处更改:
然后,添加{% assign pages_list = pages_list | sort:"weight" %} 行,如下面的代码所示。这将按重量排序。
{% for category in site.categories %}
{% if category[0] contains 'java' %}
<h3 id="{{ category[0] }}-ref">{{ category[0] | join: "/" }}</h3>
<ul>
{% assign pages_list = category[1] %}
{% assign pages_list = pages_list | sort:"weight" %}
{% include JB/pages_list %}
</ul>
{% endif %}
{% endfor %}
【讨论】:
Jekyll 只是在排序时对帖子路径进行字符串比较,这就是日期格式为年-月-日的原因。帖子内部也是集合,您可以看到在reader.rb 中调用的排序:
# Sorts posts, pages, and static files.
def sort_files!
site.collections.each_value { |c| c.docs.sort! }
site.pages.sort_by!(&:name)
site.static_files.sort_by!(&:relative_path)
end
所以它使用通用 ruby 方法来排序和实现document.rb 中的比较器:
# Compare this document against another document.
# Comparison is a comparison between the 2 paths of the documents.
#
# Returns -1, 0, +1 or nil depending on whether this doc's path is less than,
# equal or greater than the other doc's path. See String#<=> for more details.
def <=>(other)
return nil unless other.respond_to?(:data)
cmp = data["date"] <=> other.data["date"]
cmp = path <=> other.path if cmp.nil? || cmp.zero?
cmp
end
这意味着它首先比较日期并仅在需要时检查文本。
只有在不知何故找不到(无元数据)时,日期才是特殊的。对于草稿,它回退到文件修改时间,其余时间回退到站点时间。
因此,如果您想强制对同一天的帖子进行不同的排序,请在文件名中制作标题的开头以首先按字母顺序排序。例如。如果您按降序排列帖子,2020-01-01-a.md 将在 2020-01-01-b.md 之后。
【讨论】: