你如何通过Jekyll的帖子计数对site.tags进行排序?

时间:2014-07-11 14:59:16

标签: ruby jekyll

道歉,因为我是Ruby的新手,但我试图在我的模板中添加一个液体标签,我可以循环显示五个最受欢迎的标签列表。

出于某种原因,这个插件在我使用它时只输出一个标签。

这是我在mu插件中添加的内容:

module Jekyll
  class PopularTags < Liquid::Tag

    def initialize(tag_name, text, tokens)
      super
    end

    def render(context)
      tags = context.registers[:site].tags
      return tags.sort_by { |tag, posts| posts.count }
    end
  end
end
Liquid::Template.register_tag('popular_tags', Jekyll::PopularTags)

以下是我在模板中添加的内容:

{% popular_tags %}

2 个答案:

答案 0 :(得分:17)

也可以在没有插件的情况下执行此操作,这意味着它可以在GitHub Pages上使用。

我已经在my blog上做了类似的(没有插件),我正在显示一个带有帖子计数的标签列表,按字母顺序排序。 The source code is here

修改它并没有太大的努力,以便按帖子计数排序:

{% capture tags %}
  {% for tag in site.tags %}
    {{ tag[1].size | plus: 1000 }}#{{ tag[0] }}#{{ tag[1].size }}
  {% endfor %}
{% endcapture %}
{% assign sortedtags = tags | split:' ' | sort %}
{% for tag in sortedtags reversed %}
    {% assign tagitems = tag | split: '#' %}
    <li><a href="/tags/#{{ tagitems[1] }}">{{ tagitems[1] }} ({{ tagitems[2] }})</a></li>
{% endfor %}

我想有一些必要的解释:

tag[0]是代码的名称 tag[1]是一个包含标记帖子的数组,因此tag[1].size是帖子计数。

  1. 基本上,我们需要捕获类似tag[1].size#tag[0]的内容,这会产生如下字符串:

    3#TagWithThreePosts 1#TagWithOnePost 2#TagWithTwoPosts
    
  2. 然后,在{% assign sortedtags = ...行中,我们再次拆分它并对其进行排序,因此结果是一个排序的字符串数组:

    • 1#TagWithOnePost
    • 2#TagWithTwoPosts
    • 3#TagWithThreePosts
  3. 在最后一个循环中,我们以反向(=降序)顺序循环,按#分割以获取标签名称和帖子计数,并显示链接。

  4. 唯一的问题是有10个以上帖子的标签 由于我们对字符串进行排序,因此第2步的结果如下所示:

    • 1#TagWithOnePost
    • 10#TagWithTenPosts错误订单,因为它是一个字符串!
    • 2#TagWithTwoPosts
    • 3#TagWithThreePosts

    为了解决这个问题,我为了排序而在帖子数上加1000。因此1#...10#...成为1001#...1010#...,并且订单正确。

    我仍然想显示实际的帖子编号(没有添加1000个),所以我将其作为{% capture tags %}部分中的第三项添加:

    {{ tag[1].size | plus: 1000 }}#{{ tag[0] }}#{{ tag[1].size }}
    

    顺便说一句,我正在链接到一个标记页面(/tags/#blah,例如单页上所有标记的所有帖子),我也以类似的方式实现了described here。< / p>

答案 1 :(得分:3)

实际上,从我目前正在阅读的内容来看,Jekyll中的Tag插件应该像标签一样使用,而不是像变量一样。那么在这种情况下,您确实应该在模板中使用它:

{% popular_tags %}

但是你的班级行为似乎是错误的。它不应该返回变量/ hash,它应该返回将显示的HTML代码而不是popular_tags标记

例如,这是你可以做的事情:

module Jekyll
  class PopularTags < Liquid::Tag

    def initialize(tag_name, text, tokens)
      super
    end

    def render(context)
      tags = context.registers[:site].tags

      html = "<ul>"
      sorted = tags.sort_by { |t,posts| posts.count }
      sorted.each do |t, posts|
        html << "<li>TAG: #{t} (#{posts.count})</li>"
      end
      html << "</ul>"

      html
    end
  end
end

Liquid::Template.register_tag('popular_tags', Jekyll::PopularTags)

希望这会有所帮助。我只是尝试了它,它按预期工作。如果您想首先显示最常用的代码,只需更改sort_by行,然后使用-posts.count代替posts.count

您可以查看this other plugin source code,可能对您有帮助。