www/xml2ics.pl

131 lines
2.8 KiB
Prolog

#!/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://www.csclub.uwaterloo.ca>$talk_title</a> -- $short
DESCRIPTION:$ical_abstract
END:VEVENT
END_OF_EVENT
}
print "END:VCALENDAR\n";