Jekyllのタグクラウドプラグインを開発する

jekyll-taggingプラグインは十分なんだけど、
プラグイン作成のトライアルにタグクラウドが簡単そうなので作成してみる

タグページを生成する

ページ生成プログラム(tagpage.rb)

module Jekyll
    class TagPage < Page
        def initialize(site, base, dir, tag)
            @site = site
            @base = base
            @dir  = dir
            @name = 'index.html'
            
            self.process(name)
            
            self.read_yaml(File.join(base, '_layouts'), 'tag.html')
            self.data['title'] = "Entries of #{tag}"
            self.data['posts'] = site.tags[tag]
            self.data['tag'] = tag
        end
    end
    
    class TagPageGenerator < Generator
        
        safe true

        def generate(site)
            site.tags.each_key do |tag|
                site.pages << TagPage.new(site, site.source, File.join('tags', tag), tag)
            end
        end
    end
end

レイアウトファイル(tag.html)

{% raw %}---
layout: default
---
<h1>
    {{ page.tag }}
</h1>
<article class="post-content">
    <ul>
        {% for post in page.posts %}
            <li><a href="{{ post.url }}">{{ post.title }}</a></li>
        {% endfor %}
    </ul>
</article>{% endraw %}

タグクラウドを生成する

タグクラウド生成プログラム(tagcloud.rb)

module Jekyll
    class TagCloud < Liquid::Tag
        
        def initialize(tag_name, text, tokens)
            super
        end
        
        def render(context)
            tag_array = []
            site = context.registers[:site]
            site.tags.each do |tag, tag_pages|
                tag_array << tag
            end
            tag_array.sort!
            
            tagcloud = ""
            tag_array.each do |tag|
                tagcloud << "<span><a href='#{site.baseurl}/tags/#{tag}/index.html'>#{tag}</a></span>"
            end
            "#{tagcloud}"
        end
    end
end

Liquid::Template.register_tag('tag_cloud', Jekyll::TagCloud)

タグクラウド生成指定(sidebar.htmlなどへ)

{% raw %}<h1>TAG GLOUD</h1>
<div id="tag-cloud">
    {% tag_cloud %}
</div>{% endraw %}