################################ # Author: Benjamin Kellermann # # License: CC-by-sa 3.0 # # see License # ################################ require "date" require "poll" require "time" class TimePoll < Poll def sort_data fields datefields = fields.collect{|field| field == "timestamp" || field == "name" ? field : Time.parse(field) } super datefields end # returns a sorted array, containing the big units and how often each small is in the big one # small and big must be formated for strftime # ex: head_count("%Y-%m", "-%d") returns an array like [["2009-03",2],["2009-04",3]] def head_count(big,small) ret = Hash.new(0) @head.keys.collect{|curdate| Time.parse(curdate.strftime(big + small)) }.uniq.each{|day| ret[day.strftime(big)] += 1 } ret.sort end def head_to_html(config = false) ret = "" head_count("%Y-%m","-%d %H:%M%Z").each{|title,count| year, month = title.split("-").collect{|e| e.to_i} ret += "#{Date::ABBR_MONTHNAMES[month]} #{year}\n" } ret += "" head_count("%Y-%m-%d", " %H:%M%Z").each{|title,count| ret += "#{Date.parse(title).strftime("%a, %d")}\n" } ret += "Name" @head.keys.sort.each{|curdate| ret += "#{curdate.strftime("%H:%M")}\n" } ret += "Last Edit" ret end load "/home/ben/src/lib.rb/pphtml.rb" def add_remove_column_htmlform ret = "" if $cgi.include?("add_remove_column_month") if $cgi.params["add_remove_column_month"].size == 1 startdate = Time.parse("#{$cgi["add_remove_column_month"]}-1") else olddate = $cgi.params["add_remove_column_month"][1] case $cgi.params["add_remove_column_month"][0] when CGI.unescapeHTML(YEARBACK) startdate = Time.parse("#{olddate}-1")-365*24*60*60 when CGI.unescapeHTML(MONTHBACK) startdate = Time.parse("#{olddate}-1")-1*24*60*60 when CGI.unescapeHTML(MONTHFORWARD) startdate = Time.parse("#{olddate}-1")+31*24*60*60 when CGI.unescapeHTML(YEARFORWARD) startdate = Time.parse("#{olddate}-1")+366*24*60*60 else exit end startdate = Time.parse(startdate.strftime("%Y-%m-1")) end else startdate = Time.parse(Date.today.strftime("%Y-%m-1")) end ret += <
END def navi val "" end [YEARBACK,MONTHBACK].each{|val| ret += navi(val)} ret += "" [MONTHFORWARD, YEARFORWARD].each{|val| ret += navi(val)} ret += "\n" 7.times{|i| ret += "" } ret += "\n" ((startdate.wday+7-1)%7).times{ ret += "" } d = startdate while (d.month == startdate.month) do klasse = "notchoosen" klasse = "disabled" if d < Time.now - 60*60*24 klasse = "choosen" if @head.keys.collect{|t|t.strftime("%Y-%m-%d")}.include?(d.strftime("%Y-%m-%d")) ret += "\n" ret += "\n" if d.wday == 0 d += 60*60*24 end ret += <
" + "" + "#{Date::ABBR_MONTHNAMES[startdate.month]} #{startdate.year}
#{Date::ABBR_DAYNAMES[(i+1)%7]}
END ret += "
" head_count("%Y-%m", "-%d").each{|title,count| year,month = title.split("-").collect{|e| e.to_i} ret += "\n" } ret += "" head_count("%Y-%m-%d","").each{|title,count| ret += "\n" } ret += "" days = @head.sort.collect{|day,descr| Date.parse(day.strftime("%Y-%m-%d")) }.uniq @head.keys.collect{|time| time.strftime("%H:%M") }.uniq.sort.each{|time| ret +="\n" days.each{|date| timestamp = Time.parse("#{date} #{time} #{Time.now.zone}") klasse = "notchoosen" klasse = "disabled" if timestamp < Time.now klasse = "choosen" if @head.include?(timestamp) ret += <
END } ret += "
\n" } ret += "" days.each{|d| ret += <

END } ret += <
#{Date::ABBR_MONTHNAMES[month]} #{year}
#{Date.parse(title).strftime("%a, %d")}
END ret end def add_remove_column col,description if $cgi.include?("add_remove_column_day") begin parsed_date = YAML::load(Time.parse("#{$cgi["add_remove_column_month"]}-#{$cgi["add_remove_column_day"]} #{col} #{Time.now.zone}").to_yaml) rescue ArgumentError return false end else begin earlytime = @head.keys.collect{|t|t.strftime("%H:%M")}.sort[0] parsed_date = YAML::load(Time.parse("#{$cgi["add_remove_column_month"]}-#{col} #{earlytime} #{Time.now.zone}").to_yaml) rescue ArgumentError return false end end add_remove_parsed_column(parsed_date,CGI.escapeHTML(description)) end end if __FILE__ == $0 require 'test/unit' require 'pp' class TimePoll def store comment end end SITE="gbfuaibe" require "cgi" CGI_PARAMS={"add_remove_column_month" => ["2008-02"]} CGI_COOKIES={} $cgi = CGI.new class TimePollTest < Test::Unit::TestCase def setup @poll = TimePoll.new(SITE) end #TODO def test_add_remove_column assert(!@poll.add_remove_column("foo", "bar")) assert(!@poll.add_remove_column("31", "31.02.2008 ;--)")) assert(@poll.add_remove_column("20", "correct date")) assert_equal("correct date",@poll.head[Date.parse("2008-02-20")]) assert(@poll.add_remove_column("20", "foobar")) assert(@poll.head.empty?) end end end