如何在jekyll中获取已排序的tags_list

时间:2012-10-23 07:12:47

标签: jekyll

我正在使用jekyll-bootstrap在GitHub上维护博客。

我想要一个已排序的tags_list。首先发布帖子最多的标签。然后我可以有一个显示器,显示第一个带有较大字体大小的标签和带有较小字体大小的最后一个标签。我还想要一个拼接功能。

如果在python / Jinja2中,我想要一些像这样的代码:

{% for tag in sorted_tags[:10] %}
  <li style="font-size:{{ tag.count }}px;">{{ tag.name }}</li>
{% endfor %}

ruby​​ / jekyll中的等效实现是什么?

4 个答案:

答案 0 :(得分:1)

这就是我按标签中的帖子数量(降序)排序的方法,没有任何插件(即GitHub页面兼容)。

当标记名称包含空格时,它也可以使用;只有,:是禁止使用的字符(但您可以轻松更改这些字符)。

{% capture counts_with_tags_string %}{% for tag in site.tags %}{{ tag[1] | size | prepend:"000000" | slice:-6,6 }}:{{ tag[0] }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %}
{% assign counts_with_tags = counts_with_tags_string | split:"," | sort | reverse %}

<ol>
  {% for count_with_tag in counts_with_tags %}
    {% assign tag = count_with_tag | split:":" | last %}
    {% assign count = site.tags[tag] | size %}
    <li><a href="/blog/tags/{{ tag | slugify }}">{{ tag }} ({{ count }})</a></li>
  {% endfor %}
</ol>

超级糟糕。它的作用:

  • counts_with_tags_string设置为000005:first_tag,000010:second_tag,000002:third_tag之类的字符串。零填充数字是使用过滤器链| prepend:"000000" | slice:-6,6生成的。
  • 这是用逗号分割并按字典顺序排序,因为零填充而起作用。结果已分配给counts_with_tags
  • 最后,我们迭代元素并将每个元素拆分为:以查找原始标记名称。我们可以以相同的方式查找计数,但由于它是零填充,因此使用site.tags[tag] | size更容易查找。

答案 1 :(得分:0)

我认为标签数组是排序的。假设是这样,你可以这样做:

{% for tag in site.tags %}
    <li style="font-size: {{ tag[1].size }}px">{{ tag[0] }}</li>
{% endfor %}

感觉有点hacky,但它应该有效。不幸的是,Liquid目前不允许您在模板中对数组进行排序。如果你想对数组进行任何排序,你可能需要编写一个插件来实现它 - 它不应该太复杂。实际上,有一个现有的插件可以用来对访问器进行排序:https://github.com/krazykylep/Jekyll-Sort

答案 2 :(得分:0)

我只需要在列出我的标签列表的页面上的一个地方执行此操作,因此我将其写为Jekyll过滤器:

<强> tag_index.html

<h2>Posts by Tag</h2>

<ul class="tags-list">
  {{ site.tags | render_tags_list }}
</ul>

<强> _plugins / filters.rb

module Jekyll
  module Filters
    def render_tags_list(tags)
      sorted_tags = tags.keys.sort_by! { |tag| tag.downcase }

      str = ''
      sorted_tags.each { |tag|
        str << '<li>' + tags[tag].size.to_s + ' - <a href="/tag/' + tag + '">' + tag + '</a></li>'
      }

      str
    end
  end
end

如果你想在“视图”逻辑和编程逻辑之间保持更好的分离,你当然可以让过滤器返回sorted_tags,但我的情况非常简单。尝试使用Liquid模板通过特定键重新访问哈希值不是一个非常简洁的过程,或者我只是做错了,但在Ruby中更容易。

答案 3 :(得分:0)

我在github上托管我的博客并想要一个解决方案来排序标记列表涉及任何jekyll插件,因为Github不允许自定义插件(jekyll bootstrap)尝试这一点)。我在这里的帖子并没有真正回答这个问题,因为我按标签名称排序,而不是按大小排序。您可以调整此方法以在字符串中输出标记大小,然后执行一些更高级的分割以获得不同的排序顺序(但它会很混乱)

我能够使用以下代码执行此操作:

{% capture tagString %}{% for tag in site.tags %}{{ tag[0] }}{% unless forloop.last %}|{% endunless %}{% endfor %}{% endcapture %}
{% assign tags = tagString | split: '|' | sort: 'downcase' %}
<div id="cloud">
  {% for tag in tags %}
  {% assign number = site.tags[tag].size %}
  {% assign slug = tag | downcase | replace: ' ', '_' %}
  <span class="{% if number == 1 %}small{% elsif number <= 5 %}medium{% elsif number <= 10 %}large{% else %}huge{% endif %}">
    <a href="#tag-{{ slug }}">{{ tag | downcase }}</a>
  </span>
  {% endfor %}
</div>

由于我捕获了一串标签(使用|作为分隔符)然后使用它来创建一个数组,因此它有点奇怪。在该点之后(在循环中),我可以将标记称为tag,并将使用该标记的网站列表称为site.tags[tag]

我在我的博客上使用它: https://github.com/kelsin/kelsin.github.io/blob/master/tags/index.html

其余代码就是我选择在我的代码页上制作代码云的方式。希望这可以帮助其他人寻找解决方案(没有插件)!