#!/usr/bin/perl =head1 NAME Calendar - Get a calendar from a file or url and format it to a TWiki-Calendar =head1 SYNOPSIS KalenderURL filename =head1 DESCRIPTION $Id: Calendar.pl,v 1.4 2007/05/07 08:16:28 klausf Exp $ The calendar in TWiki-format is written to stdout. =head1 AUTHOR KlausF@Schule.de =head1 BUGS I encountered some errors concerning date-formats in some calendar-files. I assume calendar-data to be in utf-8 and will convert the data to latin-1. =head1 COPYRIGHT copyrighted by the author =cut use strict; use HTTP::Lite; use iCal::Parser; use Encode; my $debug = 0; sub calendarOpen { my $name = shift; my $parser=iCal::Parser->new(); my $cal; if( $name =~ /^http:/i ) { my $http = new HTTP::Lite; my $req = $http->request( $name ) or die "$name: Unknown calendar\n"; $cal=$parser->parse_strings($http->body); } else { $cal=$parser->parse( $name ); } $cal } eval { die "$0 URL (URL missing)\n" unless $ARGV[0]; my $cal = calendarOpen( $ARGV[0] ); # The following loop generates an unordered lis tof events my $ev = []; foreach my $y (values %{$cal->{events}}) { foreach my $m (values %$y) { foreach my $d (values %$m) { push @$ev, values %$d; } } } # Sort Events according to startdate $ev = [ sort { DateTime->compare_ignore_floating( $a->{DTSTART}, $b->{DTSTART} )} @$ev ]; # Convert and print foreach my $e ( @$ev ) { print ' * '; my $start = $e->{DTSTART}; my $end = $e->{DTEND}; printf "%2d %3s %4d - ", $start->day, $start-> month_abbr, $start->year; if(! $e->{allday} ) { # If difference not larger than 3 minutes # only consider starttime my $s = $start->delta_ms($end); $s = $s->in_units('minutes'); if( $s < 5 ) { printf "%d:%02d ", $start->hour, $start->minute } else { printf "%d:%02d-%d:%02d ", $start->hour, $start->minute, $end->hour, $end->minute } } print decode('utf8', $e->{SUMMARY}), "\n"; } }; print STDERR "***** $0 Error: ", $@ if $@;