我正在使用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中的等效实现是什么?
答案 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
其余代码就是我选择在我的代码页上制作代码云的方式。希望这可以帮助其他人寻找解决方案(没有插件)!