有没有一种使用Jekyll按字母顺序对多篇文章进行排序的方法?
我现在有类似这样的东西:
{% for post in site.categories.threat %}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
代码可以正常运行,但是帖子的顺序很混乱。我认为如果按字母顺序排序会更美观。
谢谢。
可以不使用插件完成,这意味着它可以与Github Pages一起使用。
但是,你必须使用一些丑陋的字符串操作技巧。
我使用了类似的方法来实现标签页(列出每个标签的所有文章)。
相同的方法,稍作修改:
{% capture posts %}
{% for post in site.posts %}
|{{ post.title }}#{{ post.url }}
{% endfor %}
{% endcapture %}
{% assign sortedposts = posts | split: '|' | sort %}
{% for post in sortedposts %}
{% assign postitems = post | split: '#' %}
<a href={{ postitems[1] }}">{{ postitems[0] }}</a><br>
{% endfor %}
在第一个循环内(当然后面的split
调用也要),您需要使用两个不同的分隔符字符。
为了使其起作用,这两个字符都不能出现在任何文章标题或URL中!!
我在本例中使用 | 和 #,这对我有效(我刚刚在我的博客上测试过)。但是,根据您的文章标题和URL的构造方式,您可能需要使用不同的字符。
如果您只想显示特定标签/类别中的帖子(而不是所有帖子),您可以将第一个for
循环(即capture
内部的循环)更改为以下之一:
{% for post in site.tags['whatever'] %}
{% for post in site.categories['whatever'] %}
{% assign sortedPosts = site.posts | sort: 'title' %}
然后sortedPosts
变量将包含已排序的数组。
文档可以在这里找到:https://docs.shopify.com/themes/liquid/filters/array-filters#sort
使用 Jekyll 在 GitHub Pages 中进行排序既干净又优雅,而不需要插件。在 _data 目录中使用您的 .yml 数据文件。我在这里使用一个名为 team-members.yml
的数据文件:
{% assign sorted_team = site.data.team-members | sort:'title' %}
{% for member in sorted_team %}
<span class="title">{{ member.title }}</span>
{% endfor %}
这个模式将处理你在这里需要做的事情。
{% sorted_for node in site.pages reversed sort_by:title case_sensitive:true %}
{{ node.title }}
{% endsorted_for %}
sorted_keys的例子:
{% sorted_keys_for tag in site.tags %}
<a href="/tags/{{ tag | downcase | replace:" ","-"}}.html">{{ tag }}</a><br />
Num posts: {{ site.tags[tag].size }}
{% endsorted_keys_for %}
在Jekyll中使用,请将此代码放置在_plugins/sort_for.rb文件中
module Jekyll
module SortedForImpl
def render(context)
sorted_collection = collection_to_sort context
return if sorted_collection.empty?
sort_attr = @attributes['sort_by']
case_sensitive = @attributes['case_sensitive'] == 'true'
i = sorted_collection.first
if sort_attr != nil
if i.to_liquid[sort_attr].instance_of? String and not case_sensitive
sorted_collection.sort_by! { |i|
k = i.to_liquid[sort_attr]
k ? k.downcase : ''
}
else
sorted_collection.sort_by! { |i|
k = i.to_liquid[sort_attr]
[k ? 1 : 0,k || 1]
}
end
else
if i.instance_of? String and not case_sensitive
sorted_collection.sort_by! { |i| i.downcase }
else
sorted_collection.sort!
end
end
original_name = @collection_name
result = nil
context.stack do
sorted_collection_name = "#{@collection_name}_sorted".sub('.', '_')
context[sorted_collection_name] = sorted_collection
@collection_name = sorted_collection_name
result = super
@collection_name = original_name
end
result
end
end
class SortedForTag < Liquid::For
include SortedForImpl
def collection_to_sort(context)
return context[@collection_name].dup
end
def end_tag
'endsorted_for'
end
end
class SortedKeysForTag < Liquid::For
include SortedForImpl
def collection_to_sort(context)
return context[@collection_name].keys
end
def end_tag
'endsorted_keys_for'
end
end
end
Liquid::Template.register_tag('sorted_for', Jekyll::SortedForTag)
Liquid::Template.register_tag('sorted_keys_for', Jekyll::SortedKeysForTag)
为了日后参考,我想要补充以下内容。
如果你想按标题排序帖子,可以使用sort
过滤器。
请参见http://jekyllrb.com/docs/templates/#filters
因此,以下方式可行:
{% assign sorted_threat_posts = site.categories.threat | sort: 'title', 'last' %}
{% for post in sorted_threat_posts %}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
{% assign sorted_team = site.data.team-members | sort: 'title', 'name' %}
但是我得到了编译错误:Liquid Exception: wrong number of arguments (3 for 2)
。 - Tony Brasunas我在本地站点测试了Christian的好方法:输出中有一个空链接(我不知道为什么),因此第一个链接无法工作,所以我修改了他的代码,在<a href={{ postitems[1] }}">{{ postitems[0] }}</a><br>
这行之前插入了{% if postitems[1] %}
,并在之后插入了{% endif %}
。建议参考tanky woo's comment。
如果没有插件或自定义函数,这是无法完成的。尽管如此,目前正在努力在下一版本中实现此功能:https://github.com/Shopify/liquid/pull/101,届时它将会是这个样子:
{% for tag in site.tags order:ascending %}
...
{% endfor %}