You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
2.8 KiB
130 lines
2.8 KiB
#!/usr/bin/perl
|
|
|
|
use XML::DOM;
|
|
use strict;
|
|
|
|
# get the first element under a node of the given tag
|
|
# @param node: node under which to look for elements
|
|
# @param tag: the tage to look for
|
|
# @return: first element under node with the given tag
|
|
sub subvalue($$)
|
|
{
|
|
my ($class, $tag) = @_;
|
|
return value($class->getElementsByTagName($tag)->item(0));
|
|
}
|
|
|
|
# get the node value of the first child of a given node
|
|
# @param node: whose child to use
|
|
# @return: node value of given node's first child
|
|
sub value($)
|
|
{
|
|
my ($class) = @_;
|
|
if (undef == $class) { return undef; }
|
|
|
|
my $child = $class->getFirstChild();
|
|
|
|
if (undef == $child) {
|
|
return undef;
|
|
}
|
|
|
|
return $child->getNodeValue();
|
|
}
|
|
|
|
print <<END_OF_FILE;
|
|
BEGIN:VCALENDAR
|
|
VERSION:2.0
|
|
X-WR-CALNAME:University of Waterloo Computer Science Club
|
|
PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
|
|
X-WR-RELCALID:3359A191-B19E-4B53-BADC-DFC084FC51C9
|
|
X-WR-TIMEZONE:Canada/Eastern
|
|
CALSCALE:GREGORIAN
|
|
METHOD:PUBLISH
|
|
BEGIN:VTIMEZONE
|
|
TZID:Canada/Eastern
|
|
LAST-MODIFIED:20060912T200739Z
|
|
BEGIN:DAYLIGHT
|
|
DTSTART:20060301T070000
|
|
TZOFFSETTO:-0400
|
|
TZOFFSETFROM:+0000
|
|
TZNAME:EDT
|
|
END:DAYLIGHT
|
|
BEGIN:STANDARD
|
|
DTSTART:20061029T020000
|
|
TZOFFSETTO:-0500
|
|
TZOFFSETFROM:-0400
|
|
TZNAME:EST
|
|
END:STANDARD
|
|
BEGIN:DAYLIGHT
|
|
DTSTART:20070311T010000
|
|
TZOFFSETTO:-0400
|
|
TZOFFSETFROM:-0500
|
|
TZNAME:EDT
|
|
END:DAYLIGHT
|
|
END:VTIMEZONE
|
|
END_OF_FILE
|
|
|
|
my $parser = XML::DOM::Parser->new();
|
|
my $doc = $parser->parsefile($ARGV[0]);
|
|
my @events = $doc->getElementsByTagName("eventitem");
|
|
|
|
foreach my $event (@events) {
|
|
my $date = $event->getAttribute("date");
|
|
my $time = $event->getAttribute("time");
|
|
my $talk_title = $event->getAttribute("title");
|
|
$talk_title =~ s/[:;,]//g;
|
|
|
|
my $room = $event->getAttribute("room");
|
|
|
|
my $short = subvalue($event, "short");
|
|
$short =~ s/[:;,]//g;
|
|
my $abstract = $event->getElementsByTagName("abstract")->item(0)->toString();
|
|
|
|
my $ical_date = `date -d"$date" +%Y%m%d`;
|
|
chomp $ical_date;
|
|
|
|
my ($ical_start, $ical_end);
|
|
|
|
if ($time =~ /(.*)-(.*)/) {
|
|
$ical_start = ical_time($1);
|
|
$ical_end = ical_time($2);
|
|
} else {
|
|
$ical_start = ical_time($time);
|
|
$ical_end = ical_time("$time + 1 hour");
|
|
}
|
|
|
|
$abstract =~ s/<abstract>//;
|
|
$abstract =~ s/<\/abstract>//;
|
|
$abstract =~ s/\n/ /sg;
|
|
|
|
my $ical_abstract = "\"$abstract\"";
|
|
|
|
sub ical_time {
|
|
my ($ds) = @_;
|
|
my $d = `date -d"$ds" +\%H\%M\%S`;
|
|
chomp $d;
|
|
return $d;
|
|
}
|
|
|
|
print <<END_OF_EVENT;
|
|
|
|
BEGIN:VEVENT
|
|
LOCATION:University of Waterloo - $room
|
|
DTSTAMP:20060912T200708Z
|
|
UID:${ical_date}T${ical_start}\@csclub.uwaterloo.ca
|
|
SEQUENCE:11
|
|
DTSTART;TZID=Canada/Eastern:${ical_date}T${ical_start}
|
|
DTEND;TZID=Canada/Eastern:${ical_date}T${ical_end}
|
|
SUMMARY:<a href=http://csclub.uwaterloo.ca>$talk_title</a> -- $short
|
|
DESCRIPTION:$ical_abstract
|
|
END:VEVENT
|
|
END_OF_EVENT
|
|
}
|
|
|
|
print "END:VCALENDAR\n";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|