Ich habe mir in den letzten Tagen einiges Plugins für Octopress angesehen, um das Blog hier um ein paar nette Optionen zu erweitern. Hier nun ein paar Worte zu dem Tagcloud Plugin, das ich entdeckt habe.
Das Tagcloud Plugin findet ihr natürlich auf Github. Dort ist auch beschrieben, wie man das in Octopress integriert. Ich habe aber noch ein paar Änderungen vorgenommen. Auf Grund des Umzugs von Wordpress, habe ich sehr viele unterschiedliche Kategorien angesammelt (die wurden aus den Wordpress Tags generiert). Somit hat das Plugin eine riesige Wolke generiert, wobei viele Tags aber nur ein- oder zweimal vorkamen. Daher habe ich das Skript so umgebaut, dass ein Begriff erst dann in die Tagcloud aufgenommen wird, wenn er mehr als fünf mal auftaucht. Hier ist das modifizierte Skript:
# encoding: utf-8
# Tag Cloud for Octopress
# =======================
#
# Description:
# ------------
# Easy output tag cloud and category list.
#
# Syntax:
# -------
# {% tag_cloud [counter:true] %}
# {% category_list [counter:true] %}
#
# Example:
# --------
# In some template files, you can add the following markups.
#
# ### source/_includes/custom/asides/tag_cloud.html ###
#
# <section>
# <h1>Tag Cloud</h1>
# <span id="tag-cloud">{% tag_cloud %}</span>
# </section>
#
# ### source/_includes/custom/asides/category_list.html ###
#
# <section>
# <h1>Categories</h1>
# <ul id="category-list">{% category_list counter:true %}
# </section>
#
# Notes:
# ------
# Be sure to insert above template files into `default_asides` array in `_config.yml`.
# And also you can define styles for 'tag-cloud' or 'category-list' in a `.scss` file.
# (ex: `sass/custom/_styles.scss`)
#
# Licence:
# --------
# Distributed under the [MIT License][MIT].
#
# [MIT]: http://www.opensource.org/licenses/mit-license.php
#
module Jekyll
class TagCloud < Liquid::Tag
def initialize(tag_name, markup, tokens)
@opts = {}
if markup.strip =~ /\s*counter:(\w+)/i
@opts['counter'] = ($1 == 'true')
markup = markup.strip.sub(/counter:\w+/i,'')
end
super
end
def render(context)
lists = {}
max, min = 1, 1
config = context.registers[:site].config
category_dir = config['root'] + config['category_dir'] + '/'
categories = context.registers[:site].categories
categories.keys.sort_by{ |str| str.downcase }.each do |category|
count = categories[category].count
lists[category] = count
max = count if count > max
end
html = ''
lists.each do | category, counter |
# only create tag cloud element, when the counter for this tag is greater than 5
if counter > 5
url = category_dir + category.gsub(/_|\P{Word}/, '-').gsub(/-{2,}/, '-').downcase
style = "font-size: #{100 + (60 * Float(counter)/max)}%"
html << "<a href='#{url}' style='#{style}'>#{category}"
if @opts['counter']
html << "(#{categories[category].count})"
end
html << "</a> "
end
end
html
end
end
class CategoryList < Liquid::Tag
def initialize(tag_name, markup, tokens)
@opts = {}
if markup.strip =~ /\s*counter:(\w+)/i
@opts['counter'] = ($1 == 'true')
markup = markup.strip.sub(/counter:\w+/i,'')
end
super
end
def render(context)
html = ""
config = context.registers[:site].config
category_dir = config['root'] + config['category_dir'] + '/'
categories = context.registers[:site].categories
categories.keys.sort_by{ |str| str.downcase }.each do |category|
url = category_dir + category.gsub(/_|\P{Word}/, '-').gsub(/-{2,}/, '-').downcase
html << "* <a href='#{url}'>#{category}"
if @opts['counter']
html << " (#{categories[category].count})"
end
html << "</a>"
end
html
end
end
end
Liquid::Template.register_tag('tag_cloud', Jekyll::TagCloud)
Liquid::Template.register_tag('category_list', Jekyll::CategoryList)