*** empty log message ***
[www/www.git] / xml2ics.pl
1 #!/usr/bin/perl
2
3 use XML::DOM;
4 use strict;
5
6 # get the first element under a node of the given tag
7 # @param node: node under which to look for elements
8 # @param tag: the tage to look for
9 # @return: first element under node with the given tag
10 sub subvalue($$)
11 {
12     my ($class, $tag) = @_;
13     return value($class->getElementsByTagName($tag)->item(0));
14 }
15
16 # get the node value of the first child of a given node
17 # @param node: whose child to use
18 # @return: node value of given node's first child
19 sub value($)
20 {
21     my ($class) = @_;
22     if (undef == $class) { return undef; }
23
24     my $child = $class->getFirstChild();
25
26     if (undef == $child) {
27         return undef;
28     }
29
30     return $child->getNodeValue();
31 }
32
33 print <<END_OF_FILE;
34 BEGIN:VCALENDAR
35 VERSION:2.0
36 X-WR-CALNAME:University of Waterloo Computer Science Club
37 PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
38 X-WR-RELCALID:3359A191-B19E-4B53-BADC-DFC084FC51C9
39 X-WR-TIMEZONE:Canada/Eastern
40 CALSCALE:GREGORIAN
41 METHOD:PUBLISH
42 BEGIN:VTIMEZONE
43 TZID:Canada/Eastern
44 LAST-MODIFIED:20060912T200739Z
45 BEGIN:DAYLIGHT
46 DTSTART:20060301T070000
47 TZOFFSETTO:-0400
48 TZOFFSETFROM:+0000
49 TZNAME:EDT
50 END:DAYLIGHT
51 BEGIN:STANDARD
52 DTSTART:20061029T020000
53 TZOFFSETTO:-0500
54 TZOFFSETFROM:-0400
55 TZNAME:EST
56 END:STANDARD
57 BEGIN:DAYLIGHT
58 DTSTART:20070311T010000
59 TZOFFSETTO:-0400
60 TZOFFSETFROM:-0500
61 TZNAME:EDT
62 END:DAYLIGHT
63 END:VTIMEZONE
64 END_OF_FILE
65
66 my $parser = XML::DOM::Parser->new();
67 my $doc = $parser->parsefile($ARGV[0]);
68 my @events = $doc->getElementsByTagName("eventitem");
69
70 foreach my $event (@events) {
71     my $date = $event->getAttribute("date");
72     my $time = $event->getAttribute("time");
73     my $talk_title = $event->getAttribute("title");
74     $talk_title =~ s/[:;,]//g;
75
76     my $room = $event->getAttribute("room");
77
78     my $short = subvalue($event, "short");
79     $short =~ s/[:;,]//g;
80     my $abstract = $event->getElementsByTagName("abstract")->item(0)->toString();
81
82     my $ical_date = `date -d"$date" +%Y%m%d`;
83     chomp $ical_date;
84
85     my ($ical_start, $ical_end);
86
87     if ($time =~ /(.*)-(.*)/) {
88         $ical_start = ical_time($1);
89         $ical_end = ical_time($2);
90     } else {
91         $ical_start = ical_time($time);
92         $ical_end = ical_time("$time + 1 hour");
93     }
94
95     $abstract =~ s/<abstract>//;
96     $abstract =~ s/<\/abstract>//;
97     $abstract =~ s/\n/ /sg;
98
99     my $ical_abstract = "\"$abstract\"";
100
101 sub ical_time {
102     my ($ds) = @_;
103     my $d = `date -d"$ds" +\%H\%M\%S`;
104     chomp $d;
105     return $d;
106
107
108 print <<END_OF_EVENT;
109
110 BEGIN:VEVENT
111 LOCATION:University of Waterloo - $room
112 DTSTAMP:20060912T200708Z
113 UID:${ical_date}T${ical_start}\@csclub.uwaterloo.ca
114 SEQUENCE:11
115 DTSTART;TZID=Canada/Eastern:${ical_date}T${ical_start}
116 DTEND;TZID=Canada/Eastern:${ical_date}T${ical_end}
117 SUMMARY:<a href=http://www.csclub.uwaterloo.ca>$talk_title</a> -- $short
118 DESCRIPTION:$ical_abstract 
119 END:VEVENT
120 END_OF_EVENT
121 }
122
123 print "END:VCALENDAR\n";
124     
125     
126
127
128     
129
130