Funkenstrahlen Podcasting, Netzpolitik, App-Entwicklung

Octopress Tagclound

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:

``` ruby %}

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>

{% tag_cloud %}

</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) ```