6

我正在使用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

4 回答 4

3

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

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

{% 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
于 2017-06-22T10:35:05.433 回答
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 中要容易得多。

于 2014-01-02T02:36:11.287 回答
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

于 2012-11-01T21:38:06.443 回答
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

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

于 2014-05-29T19:36:47.553 回答