$LOAD_PATH.reject! { |e| e.include? 'TextMate' } require 'rubygems' require 'icalendar' include Icalendar # Fall Semester is Sep 2, 2008 to Dec 11, 2008 semester_start = DateTime.civil(2008, 9, 2) semester_end = DateTime.civil(2008, 12, 11) cal = Calendar.new class UniversityClass ATTRS = [:abbrev, :section, :sec_type, :reg_num, :tc, :lq, :hours, :time, :days, :room, :building, :name, :instructor] attr_accessor *ATTRS def initialize(*args) ATTRS.each_with_index { |a, i| instance_variable_set("@#{a}", args[i]) } end def days(str = @days) case str when "" then [] when /^M/ then [1] + days(str[1..-1]) when /^T[^h]/ then [2] + days(str[1..-1]) when /^W/ then [3] + days(str[1..-1]) when /^Th/ then [4] + days(str[2..-1]) when /^F/ then [5] + days(str[1..-1]) else raise "Unknown weekday: #{str}" end end def str_to_hour_minute(str) hour, minute = str.split(":").map{ |s| s.to_i } case str when /A$/i # AM hour = 0 if hour == 12 when /P$/i # PM hour += 12 if hour != 12 else raise "Unknown time #{@time}" end [hour, minute] end def hour_minute_start start, finish = @time.split(/\s*\-\s*/) str_to_hour_minute(start) end def hour_minute_end start, finish = @time.split(/\s*\-\s*/) str_to_hour_minute(finish) end def dtstart end def dtend end end previous_columns = [] DATA.read.to_a.each do |row| columns = row.split /[ \n]*\t[ \n]*/ if columns.first.empty? # Use previous column to construct this one columns = previous_columns[0..6] + columns[1..4] + previous_columns[11..12] end uclass = UniversityClass.new(*columns) # Loop through each day of the semester and create class "events" for each for date in semester_start..semester_end if uclass.days.include? date.wday hour, minute = uclass.hour_minute_start dtstart = DateTime.civil(date.year, date.month, date.day, hour, minute) hour, minute = uclass.hour_minute_end end_time = DateTime.civil(date.year, date.month, date.day, hour, minute) # Build iCal event cal.event do |e| e.summary uclass.name hour, minute = uclass.hour_minute_start e.dtstart DateTime.civil(date.year, date.month, date.day, hour, minute) hour, minute = uclass.hour_minute_end e.dtend DateTime.civil(date.year, date.month, date.day, hour, minute) e.description "#{uclass.name}\n#{uclass.building} rm. #{uclass.room}\n#{uclass.instructor}\n#{uclass.abbrev}:#{uclass.section}" # e.klass "PRIVATE" end end end previous_columns = columns end File.open "School.ics", "w" do |f| f.write cal.to_ical end __END__ A HTG 100 052 02859 006 3.0 11:00a - 11:50a F 174 JSB American Heritage Holland, Matthew S 11:00a - 11:50a MW 140 JSB C S 312 002 01499 001 3.0 9:30a - 10:45a TTh 120 TMCB Algorithm Analysis Warnick, Sean C C S 360 001 11294 000 3.0 10:00a - 10:50a MWF 134 TMCB Internet Programming Snell, Quinn O C S 404 001 10181 000 2.0 1:35p - 2:50p TTh 1170 TMCB Ethics & Computers in Society Roper, Paul Ross EXSC 141 001 04359 005 0.5 9:00a - 9:50a MW EXTEN IPF Martial Arts Pease, Michael W HIST 201 005 08211 004 3.0 2:00p - 2:50p MWF 275 MARB Honrs World Civilizatn to 1500 Harline, Craig E REL C 324 023 05044 000 2.0 12:00p - 12:50p TTh 380 BRMB The Doctrine & Covenants Wilkes, Charles Wynn