#!/usr/bin/env ruby $:.unshift('vendor/ruby-mediawiki/lib') $:.unshift('vendor/htree') require 'mediawiki/dotfile' @wiki = MediaWiki.dotfile(nil,'entropia') require 'date' #---------------------------------------------------------------------------- def parse_template(title, template) template_re = Regexp.new("\\\{\\\{" + template + "(.*?)\\\}\\\}") fields = {} fields_string = @wiki.article(title).text.scan(template_re)[0][0] inlink = 0 field = "" fields_string += "|" unless fields_string.match(/\|$/) fields_string.split(//).each do |c| if c == "|" && inlink == 0 (key, value) = field.split(/=/) fields[key] = value field = "" else inlink += 1 if c == "[" inlink -= 1 if c == "]" field += c end end fields end def datum2isodate(datum) return datum[6..9] + "-" + datum[3..4] + "-" + datum[0..1] end def table_termine (t) body = '{| border=1 cellspacing="0" cellpadding="5" style="border-collapse:collapse;"' body += "\n" body += "| Datum \n| Uhrzeit \n| Ort \n| Beschreibung \n|-\n" t.each do |termin| body += "| " + termin["datum"].to_s + "\n" body += "| " + termin["uhrzeit"].to_s + "\n" body += "| " + termin["ort"].to_s + "\n" body += "| " + termin["beschreibung"].to_s + "\n" body += "|-\n" end body += "|}" return body end #---------------------------------------------------------------------------- termine = [] template = "Vorlage:Radio Chaotica-Sendung" @wiki.article(template).what_links_here.each do |page| if erste_sendung = parse_template(page, template)["erste_sendung"] termin = {} termin["datum"] = erste_sendung.gsub(/\s*um\s*\d+:\d+$/,"") termin["uhrzeit"] = "16:00" termin["beschreibung"] = "[[" + page + "]]" termin["ort"] = "[http://www.querfunk.de Querfunk]" termine.push(termin) else $stderr.print(page, ": erste_sendung nicht gesetzt") end end #---------------------------------------------------------------------------- template = "Vorlage:Termin" @wiki.article(template).what_links_here.each do |page| termin = parse_template(page, template) termine.push(termin) end #---------------------------------------------------------------------------- # Get a real date termine.each do |termin| if termin["datum"] !~ /^[0-9]{2}\.[0-9]{2}\.[0-9]{4}.*$/ puts "#{termin["datum"]} looks funny, fall back to today." termin["date"] = Date.today() else termin["date"] = Date.parse(datum2isodate(termin["datum"])) end end termine = termine.sort do |x,y| x["date"] <=> y["date"] end vergangene_termine = termine.clone.delete_if { |t| t["date"] >= Date.today() } kommende_termine = termine.clone.delete_if { |t| t["date"] < Date.today() } body = "== Vergangene Termine ==\n" body += table_termine(vergangene_termine) body += "\n== Kommende Termine ==\n" body += table_termine(kommende_termine) a = @wiki.article("Benutzer:Neingeist/Termine") a.text = body a.submit("wiki ex machina")