使用液体按字母顺序排序

时间:2012-01-24 18:24:25

标签: filter jekyll liquid

有没有办法按字母顺序对一些帖子进行排序,使用Jekyll?

我现在有这样的事情:

{% for post in site.categories.threat %}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}

它有效,但帖子混乱了。如果按照字母顺序对它进行排序,看起来会更好看。

由于

7 个答案:

答案 0 :(得分:21)

可以在没有插件的情况下完成,这意味着它可以与Github Pages一起使用。

但是你必须使用一些丑陋的字符串操作技巧 我使用了类似的方法to implement a tag page (that lists all posts for each tag)

相同的方法,略有修改:

{% 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次调用)
为了实现这一点,两个字符都不得出现在任何帖子标题或网址中!!

我在这个示例中使用了|#,这对我来说很有用(我刚用我的博客测试过它)。但您可能需要使用不同的字符,具体取决于您的帖子标题以及您的网址的构建方式。


加成:

如果您只想显示某个标记/类别(而不是所有帖子)中的帖子,您可以更改第一个for循环capture其中一个:

{% for post in site.tags['whatever'] %}

{% for post in site.categories['whatever'] %}

答案 1 :(得分:12)

根据文档,要通过其中一个字段过滤数组,您可以使用:

    {% assign sortedPosts = site.posts | sort: 'title' %}

然后sortedPosts变量将包含已排序的数组。

可以在此处找到文档:https://docs.shopify.com/themes/liquid/filters/array-filters#sort

答案 2 :(得分:8)

在没有插件的情况下,在GitHub页面中对Jekyll进行排序既干净又优雅。在_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 %}

此模式将处理您需要执行的操作。

答案 3 :(得分:5)

我从https://gist.github.com/3812259改编了一个Jekyll插件来实现这个目标。我无法按原样使用插件,因为它在存在空值时失败。我是一名初学红宝石程序员,并在https://stackoverflow.com/a/808721/1135052

的帮助下对空值处理进行了编码

sort_for示例反转排序并执行区分大小写的字符串比较(如果sorted属性不是字符串,则忽略):

{% sorted_for node in site.pages reversed sort_by:title case_sensitive:true %}
  {{ node.title }}
{% endsorted_for %}

sorted_keys_for例如:

{% 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)

答案 4 :(得分:2)

我想添加以下内容供将来参考。

要按标题对帖子进行排序,您可以使用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 %}

答案 5 :(得分:0)

没有插件或自定义功能就无法完成。尽管如此,我们仍在不断努力在下一版本中实现这一点:https://github.com/Shopify/liquid/pull/101然后它看起来像:

{% for tag in site.tags order:ascending %} 
   ...
{% endfor %}

另请参阅:Order an array with Jekyll / liquid template

答案 6 :(得分:0)

我在我的本地网站上测试了克里斯蒂安的伟大解决方案:在第一行之前,输出中有一个空链接(我不知道为什么),因此第一个链接不起作用,所以我修改了他的代码在行{% if postitems[1] %}之前插入<a href={{ postitems[1] }}">{{ postitems[0] }}</a><br>和之后{% endif %}。建议tanky woo's comment