2012-10-23 18 views
4

我正在使用jekyll-bootstrap在GitHub上維護一個博客。如何在jekyll中獲得排序的tags_list

我想有一個排序的tags_list。首先發布帖子最多的標籤。然後我可以看到一個顯示器,顯示第一個標記的字體較大,最後一個標記的字體較小。我也想要一個拼接功能。

如果在Python/Jinja2的,我希望像這樣的代碼:

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

是什麼在紅寶石/傑基爾相當於實施?

回答

0

我認爲標籤數組是排序的。假設是這樣,你可以這樣做:

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

這感覺有點不好,但它應該工作。不幸的是,Liquid目前不允許您在模板中對數組進行排序。如果你想對數組進行任何排序,你可能必須編寫一個插件來完成 - 它不應該太複雜。實際上,現有的排序訪問器插件可能會這樣做:https://github.com/krazykylep/Jekyll-Sort

+0

似乎是正確的答案。我不熟悉ruby。這需要我花一些時間來研究。 – hbrls

+0

不幸的是標籤數組沒有排序。不是通過標籤名稱。不按參考帖子的數量。 –

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,但我的情況很簡單。嘗試使用液體模板特定鍵重新訪問的哈希值不是一個非常簡潔的過程,也許我只是做是錯誤的,但在Ruby中容易得多。

0

我主持我在GitHub上的博客,並希望解決的排序是沒有涉及任何傑奇插件,因爲Github上不允許自定義插件(傑奇引導嘗試此以及)標籤列表。我的帖子在這裏並沒有真正回答這個問題,因爲我按標籤名稱排序,而不是按大小排序。你可以使用這種方法來輸出標籤的大小以及字符串,然後做一些發燒友拆分以得到不同的排序順序(但它會很混亂)

我可以用下面的代碼做到這一點:

{% 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

的代碼的其餘部分是多麼我選擇讓我的標籤頁面上的標籤雲。希望這可以幫助別人尋找一個解決方案(無插件)!

+0

我在這個博客上發現了另一個解決方案:http://blog.jupo.org/2013/05/05/sandboxed-jekyll-hacks/ – Kelsin

0

這就是我如何按照標籤中的帖子數量(降序)排序,沒有任何插件(即兼容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代替它更容易。
相關問題