From dc83d34aea5c3c6d2a57323a1dda2f329e6d4b59 Mon Sep 17 00:00:00 2001 From: Tim Pope Date: Sat, 28 Aug 2004 16:27:02 +0000 Subject: [PATCH] Transcript and vCalendar support --- perl/sctweb | 100 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 84 insertions(+), 16 deletions(-) diff --git a/perl/sctweb b/perl/sctweb index da66f4b..94fc19b 100755 --- a/perl/sctweb +++ b/perl/sctweb @@ -65,7 +65,7 @@ sub off_for_exams { return wantarray ? () : undef unless ($finalday[6] == 0); my $beginning="(08:00-09:15|11:00-12:15|14:00-15:15|17:00-18:15|17:30-18:45|20:00-21:15|20:30-21:45)"; my $ending ="(06:30-07:45|09:30-10:45|12:30-13:45|15:30-16:45|18:30-19:45|19:00-20:15)"; - if($_[1] eq "Mon Wed") { + if($_[1] =~ /^Mon? We[d ]?$/) { if($_[2] =~ /$beginning/) { $_[3] =~ /\d{8}-(\d{8})/; return "!" . ($1-4); @@ -73,7 +73,7 @@ sub off_for_exams { $_[3] =~ /\d{8}-(\d{8})/; return "!" . ($1-6); } - } elsif($_[1] eq "Tue Thu") { + } elsif($_[1] =~ /^Tue? Th[u ]?$/i) { if($_[2] =~ /$beginning/) { $_[3] =~ /\d{8}-(\d{8})/; return "!" . ($1-3); @@ -142,12 +142,12 @@ X-SC-Duration: 19861102- X-SC-Subject: Presidents Day X-SC-Category: Holiday X-SC-Cond: 3rd Mon Feb -X-SC-Duration: 17760704- +X-SC-Duration: 19710515- X-SC-Subject: Memorial Day X-SC-Category: Holiday X-SC-Cond: Last Mon May -X-SC-Duration: 17760704- +X-SC-Duration: 19710531- X-SC-Subject: Independence Day X-SC-Category: Holiday @@ -157,14 +157,17 @@ X-SC-Duration: 17760704- X-SC-Subject: Labor Day X-SC-Category: Holiday X-SC-Cond: 1st Mon Sep +X-SC-Duration: 18840901- X-SC-Subject: Columbus Day X-SC-Category: Holiday X-SC-Cond: 2nd Mon Oct +X-SC-Duration: 19711011- X-SC-Subject: Veterans Day X-SC-Category: Holiday X-SC-Cond: 11 Nov +X-SC-Duration: 19261111- X-SC-Subject: Thanksgiving X-SC-Category: Holiday @@ -222,15 +225,6 @@ sub do_mhc_schedule { $row->[4] =~ s/ON CAMPUS-//g; $row->[4] =~ s/-/ /g; my @day = (off_for_holidays(@$row),off_for_exams(@$row)); - #my $day = join(" ",off_for_holidays(@$row),off_for_exams(@$row)); - my $day = ""; - #print "@day*\n"; - #$day = join(" ",@day) if (@day); -# if(defined($day)) { -# $day .= " ".off_for_holidays(@$row); -# } else { -# $day = off_for_holidays(@$row); -# } print "\n"; print "# $id\n"; print "X-SC-Subject: ", $row->[0], "\n"; @@ -246,6 +240,81 @@ sub do_mhc_schedule { } } +sub do_vcalendar_schedule { + $| = 1; + my @readheaders = ("Section ID/Title", "Days", "Time", "Start/EndDates", "Site/Building/Room"); + my %days = (M => "Mon", T => "Tue", W => "Wed", R => "Thu", F => "Fri", S => "Sat"); + my %daycodes = (M => "MO", T => "TU", W => "WE", R => "TH", F => "FR", S => "SA"); + my $te = new HTML::TableExtract( headers => [ @readheaders ] ); + my (@terms, $row, $file); + $file = shift if (defined $_[0] and $_[0] !~ /^\d/); + @terms = get_schedule_terms(); + foreach(@_ || @terms) { + $response = $ua->get("$url&tserve_tip_write=||WID|SID|PIN|Term&tserve_trans_config=" . ($opts{cfg} || "rstusch" || "rgrades") . ".cfg&Term=".($_) ); + die $response->status_line unless $response->is_success; + $te->parse($response->content); + } +# $response = $ua->get("http://localhost/~tpope/schedule.html"); +# $te->parse($response->content); + open(STDOUT, ">>" . $file) if(defined($file) && (-f $file)); + open(STDOUT, ">/dev/null") if(defined($file) && (-d $file)); + print "BEGIN:VCALENDAR\r\nVERSION:1.0\r\n"; + foreach $ts ($te->table_states) { + foreach $row ($ts->rows) { + map { s/\xa0//g; s/\n/-/g; $_} @$row; + $row->[0] =~ s/.*launchWebCT\("([^"]*)"\).*/$1/s; + $row->[0] =~ s/(.*)
//g; + my $classid=$1; + $row->[0] = capitalize($row->[0]); + my $meets = $row->[1]; + $meets =~ s/([MTWRFS])/$daycodes{$1} /g; + $row->[1] =~ s/([MTWRFS])/ $days{$1}/g; + $row->[1] =~ s/^ //; + if($row->[2] =~ /^(\d\d):\d\d-(\d\d):\d\dPM$/) { + $row->[2] =~ s/^(\d\d)/$1+12/e + if($1 < $2); + $row->[2] =~ s/-(\d\d)/"-".($1+12)/e; + $row->[2] =~ s/PM$//; + } else { $row->[2] =~ s/AM$//; } + $row->[3] =~ s/(\d\d)-(\d\d)-(\d\d)/20$3$1$2/g; + $row->[4] =~ s/ON CAMPUS-//g; + $row->[4] =~ s/-/ /g; + my @day = (off_for_holidays(@$row),off_for_exams(@$row)); + my $day = ""; + if(exists($day[0])) { + $day = join(";", @day); + $day =~ s/!(\d{8})/$1T000000/g; + } + $row->[2] =~ s/://g; + my ($starttime, $stoptime)=split(/-/, $row->[2]); + my ($startdate, $stopdate)=split(/-/, $row->[3]); + if(defined($file) && (-d $file)) { + open FH, ">$file/$classid.vcs"; + select FH; + print "BEGIN:VCALENDAR\r\nVERSION:1.0\r\n"; + } + print "BEGIN:VEVENT\r\n"; + print "SUMMARY:", $row->[0], "\r\n"; + print "DESCRIPTION:", $classid, "\r\n"; + print "LOCATION:", $row->[4], "\r\n"; + print "CATEGORIES:Education\r\n"; + print "DTSTART:", $startdate."T".$starttime, "00\r\n"; + print "DTEND:", $startdate."T".$stoptime, "00\r\n"; + print "RRULE:W1 ", $meets.$stopdate, "T000000\r\n"; + + print("EXDATE:$day\r\n") if($day); + print "ATTENDEE;ROLE=OWNER;STATUS=CONFIRMED:", $opts{NAME}, "\r\n" if(defined($opts{NAME})); + print "END:VEVENT\r\n"; + if(defined($file) && (-d $file)) { + print "END:VCALENDAR\r\n"; + close FH; + select STDOUT; + } + } + } + print "END:VCALENDAR\r\n"; +} + sub do_html_schedule { my @readheaders = ("Section ID/Title", "Instructor", "Days", "Time", "Start/EndDates", "Site/Building/Room"); my @showheaders = ("Section ID/Title", "Instructor", "Days", "Time", "Duration", "Location"); @@ -326,14 +395,13 @@ my $arg = ""; $arg = shift if (defined($ARGV[0]) && $ARGV[0] =~ /^-\w$/); if ($arg eq "-g") { - shift; do_html_grades; } elsif ($arg eq "-s") { - shift; do_html_schedule; } elsif ($arg eq "-m") { - shift; do_mhc_schedule(@ARGV); +} elsif ($arg eq "-v") { + do_vcalendar_schedule(@ARGV); } elsif ($arg eq "-t") { do_transcripts; } -- 2.30.2