# # category_to_tagcloud.rb # # Usage: # <% tag_list n %> # n: 表示最大数(default: nil) # # options configurable through settings: # @options['tagcloud.hidecss'] : cssの出力 default: false # # This plugin modifes and includes tagcloud-ruby. # http://yatsu.info/articles/2005/08/05/ruby%E3%81%A7tagcloud-tagcloud-ruby require 'pstore' def category_enable? !@plugin_files.grep(/\/category\.rb$/).empty? end def add tag, url, count, elapsed_time @counts[tag] = count @urls[tag] = url @elapsed_times[tag] = elapsed_time end def print_html tags = @counts.sort_by {|a, b| b }.reverse.map {|a, b| a } return '' if tags.empty? tags = tags[0..@limit-1] if @limit if tags.size == 1 tag = tags[0] url = @urls[tag] elapsed_time = @elapsed_times[tag] return %{\n} end min = Math.sqrt(@counts[tags.last]) max = Math.sqrt(@counts[tags.first]) factor = 0 # special case all tags having the same count if max - min == 0 min = min - 24 factor = 1 else factor = 24 / (max - min) end html = %{" html end def init_category_to_tagcloud @counts = Hash.new @urls = Hash.new @elapsed_times = Hash.new @conf['category_to_tagcloud.cache'] ||= "#{@cache_path}/category2tagcloud.cache" @limit = nil end def tag_list limit = nil return '' if bot? return '' unless category_enable? init_category_to_tagcloud cache = @conf['category_to_tagcloud.cache'] @limit = limit PStore.new(cache).transaction(read_only=true) do |db| break unless db.root?('tagcloud') or db.root?('last_update') break if Time.now.strftime('%Y%m%d').to_i > db['last_update'] @counts = db['tagcloud'][0] @urls = db['tagcloud'][1] @elapsed_times = db['tagcloud'][2] end gen_tag_list if @urls.empty? print_html end def styleclass diff c = ' old' if diff > 30 c = " oldest" elsif diff > 14 c = " older" elsif diff < 7 c = " hot" end c end def gen_tag_list init_category_to_tagcloud if @mode == 'append' or @mode == 'replace' cache = @conf['category_to_tagcloud.cache'] info = Category::Tagcloud_Info.new(@cgi, @years, @conf) categorized = @category_cache.categorize(info.category, info.years) categorized.keys.each do |key| count = categorized[key].size ymd = categorized[key].keys.sort.reverse diff = (Time.now - Time.local(ymd[0][0,4], ymd[0][4,2], ymd[0][6,2])) / 86400 url = "#{@conf.index}?category=#{CGI.escape(key)}" add(key, url, count, "#{styleclass(diff.to_i)}") end PStore.new(cache).transaction do |db| db['last_update'] = Time.now.strftime('%Y%m%d').to_i db['tagcloud'] = [@counts, @urls, @elapsed_times] end end def tagcloud_css r = '' r = "\t\n" r end add_update_proc do gen_tag_list if @mode == 'append' or @mode == 'replace' end add_header_proc do tagcloud_css unless @conf['tagcloud.hidecss'] end if category_enable? module Category class Tagcloud_Info < Info def years now_year = Time.now.year now_month = Time.now.month r = Hash.new months = [ ['01'],['01','02'],['01','02','03'],['02','03','04'],['03','04','05'], ['04','05','06'],['05','06','07'],['06','07','08'],['07','08','09'], ['08','09','10'],['09','10','11'],['10','11','12'] ][now_month - 1] r[now_year.to_s] = months case now_month when 1 r["#{now_year - 1}"] = ['11','12'] when 2 r["#{now_year - 1}"] = ['12'] end r end end end end ## vim: ts=3