Jekyll标签列表不区分大小写排序问题及代码咨询
解决Jekyll标签不区分大小写排序的问题
嘿,这个不区分大小写的标签排序问题我之前也碰到过,给你两种方案,根据你的Jekyll版本来选就好!
方案一:适合Jekyll 3.0+(推荐)
Jekyll 3.0及以上版本的sort过滤器支持case_insensitive参数,直接用这个就能轻松实现不区分大小写排序,代码简洁又直观:
<ul> {% assign sorted_tags = site.tags | sort:0 case_insensitive: true %} {% for tag in sorted_tags %} {% capture tag_name %}{{ tag[0] }}{% endcapture %} <li> <a href="#{{ tag_name | cgi_escape }}" class="tag"> {{ tag_name }} <span>({{ tag[1].size }})</span> </a> </li> {% endfor %} </ul>
代码说明:
site.tags | sort:0 case_insensitive: true:site.tags是一个哈希集合,每个元素是[标签名, 对应文章数组]。sort:0指定按哈希的第一个元素(也就是标签名)排序,case_insensitive: true开启不区分大小写模式,这样"CSS"和"css"会被视为同一排序项,最终按自然字母顺序排列(比如accessibility→CSS→JavaScript)。- 循环
sorted_tags时,tag[0]保留标签原本的大小写显示,tag[1].size直接获取该标签下的文章数量,不用额外处理。
方案二:适合Jekyll 3.0以下版本
如果你的Jekyll版本比较老,不支持case_insensitive参数,可以手动通过转换小写来实现排序:
<ul> {% capture tag_list %}{% for tag in site.tags %}{{ tag[0] | downcase }}|{{ tag[0] }}{% endfor %}{% endcapture %} {% assign tag_words = tag_list | split:'|' | sort %} {% for item in (0..tag_words.size) step 2 %} {% unless forloop.last %} {% capture this_word %}{{ tag_words[item+1] }}{% endcapture %} <li> <a href="#{{ this_word | cgi_escape }}" class="tag"> {{ this_word }} <span>({{ site.tags[this_word].size }})</span> </a> </li> {% endunless %} {% endfor %} </ul>
代码说明:
- 先把每个标签转换成「小写标签名|原标签名」的格式,拼接成字符串后分割成数组,再对数组排序(此时排序是基于小写标签名,实现不区分大小写)。
- 最后按
step 2循环数组,取出原标签名来显示,同时获取对应的文章数量。
内容的提问来源于stack exchange,提问作者Matt Smith
相关产品推荐
相关产品推荐

