X-Git-Url: http://pere.pagekite.me/gitweb/homepage.git/blobdiff_plain/0335f6bfefc6fff14412b90c047aaafb771123b9..93ddf11b60fb9f5875e9e5dfd4c1ba034b6f60e9:/linux/plan2icalendar diff --git a/linux/plan2icalendar b/linux/plan2icalendar index f128ab0888..ad051624b2 100755 --- a/linux/plan2icalendar +++ b/linux/plan2icalendar @@ -17,15 +17,17 @@ use Getopt::Std; use Date::Parse; use Date::Format; use Date::ICal; +use iCal::Parser; +use Data::Dumper; my @events; my %opts; -my $debug = 0; -unless (getopts('if:o:', \%opts)) { +unless (getopts('dif:o:', \%opts)) { usage(); exit 1; } +my $debug = $opts{d} || 0; my $input = $opts{f}; my $output = $opts{o}; @@ -47,6 +49,7 @@ Imports or exports between plan and iCalendar. -i import ical file -f infile read input from 'infile' -o outfile read output from 'outfile' + -d enable debug output EOF } sub read_planfile { @@ -150,31 +153,67 @@ EOF # sub read_icalendar { my $filename = shift; + + if (1) { + my $parser = iCal::Parser->new(); + my $hash = $parser->parse($filename); +# print Dumper($hash) if $debug; +# print Dumper($hash->{'events'}); + for my $year (sort keys %{$hash->{'events'}}) { + for my $month (sort keys %{$hash->{'events'}->{$year}}) { + for my $day (sort keys %{$hash->{'events'}->{$year}->{$month}}) { + for my $evid (keys %{$hash->{'events'}->{$year}->{$month}->{$day}}) { + my $event = + $hash->{'events'}->{$year}->{$month}->{$day}->{$evid}; +# print "$year-$month-$day $evid\n"; +# print Dumper($event); + + my %newevent; + $newevent{description} = $event->{'DESCRIPTION'}; + $newevent{created} = $event->{'CREATED'}; + $newevent{dtend} = $event->{'DTEND'}; + $newevent{dtstamp} = $event->{'DTSTAMP'}; + $newevent{dtstart} = $event->{'DTSTART'}; + $newevent{'last-modified'} = $event->{'LAST-MODIFIED'}; + $newevent{sequence} = $event->{'SEQUENCE'}; + $newevent{summary} = $event->{'SUMMARY'}; + $newevent{uid} = $event->{'UID'}; +# print Dumper(%newevent); + push(@events, \%newevent); + print STDERR "Event pushed\n" if $debug; + } + } + } + } + } else { open (ICALENDAR, "<$filename") or die "Unable to read from $filename"; my $oldval = $/; $/ = "\r\n"; + print STDERR "Loading $filename\n" if $debug; while () { - chomp; - if (m/^BEGIN:VEVENT/) { - my %event; - while () { - chomp; - last if (m/END:VEVENT/); - $event{description} = $1 if (m/^DESCRIPTION\s*:\s*(.+)$/); - $event{created} = $1 if (m/^CREATED\s*:\s*(.+)$/); - $event{dtend} = $1 if (m/^DTEND\s*:\s*(.+)$/); - $event{dtstamp} = $1 if (m/^DTSTAMP\s*:\s*(.+)$/); - $event{dtstart} = $1 if (m/^DTSTART\s*:\s*(.+)$/); - $event{last-modified} = $1 if (m/^LAST-MODIFIED\s*:\s*(.+)$/); - $event{sequence} = $1 if (m/^SEQUENCE\s*:\s*(.+)$/); - $event{summary} = $1 if (m/^SUMMARY\s*:\s*(.+)$/); - $event{uid} = $1 if (m/^UID\s*:\s*(.+)$/); - } - push @events, \%event; - } + chomp; + if (m/^BEGIN:VEVENT/) { + my %event; + while () { + chomp; + last if (m/END:VEVENT/); + $event{description} = $1 if (m/^DESCRIPTION\s*:\s*(.+)$/); + $event{created} = $1 if (m/^CREATED\s*:\s*(.+)$/); + $event{dtend} = $1 if (m/^DTEND\s*:\s*(.+)$/); + $event{dtstamp} = $1 if (m/^DTSTAMP\s*:\s*(.+)$/); + $event{dtstart} = $1 if (m/^DTSTART\s*:\s*(.+)$/); + $event{last-modified} = $1 if (m/^LAST-MODIFIED\s*:\s*(.+)$/); + $event{sequence} = $1 if (m/^SEQUENCE\s*:\s*(.+)$/); + $event{summary} = $1 if (m/^SUMMARY\s*:\s*(.+)$/); + $event{uid} = $1 if (m/^UID\s*:\s*(.+)$/); + } + push @events, \%event; + print STDERR "Event pushed\n" if $debug; + } } close (ICALENDAR); $/ = $oldval; + } } # Simple version covering the chars I need. @@ -183,6 +222,9 @@ sub utf8tolocalmap { $string =~ s/ø/ø/g; $string =~ s/æ/æ/g; $string =~ s/Ã¥/å/g; + $string =~ s/Å/Å/g; + $string =~ s/«/«/g; + $string =~ s/»/»/g; return $string; } @@ -191,11 +233,21 @@ sub write_planfile { open(PLAN, ">$filename") or die "Unable to write to $filename"; for my $event (@events) { # offset = 0 -- assume all timestamps in local time zone - my $ical = Date::ICal->new( ical => $event->{dtstart}, offset => 0 ); + my $ical; + if ("DateTime" eq ref $event->{dtstart}) { + $ical = Date::ICal->new( epoch => $event->{dtstart}->epoch ); + } else { + $ical = Date::ICal->new( ical => $event->{dtstart}, offset => 0 ); + } my $date = join("/", $ical->month, $ical->day, $ical->year); my $start = join(":", $ical->hour, $ical->min, $ical->sec); - my $icalstop = Date::ICal->new( ical => $event->{dtend}, offset => 0 ); + my $icalstop; + if ("DateTime" eq ref $event->{dtend}) { + $icalstop = Date::ICal->new( epoch => $event->{dtend}->epoch ); + } else { + $icalstop = Date::ICal->new( ical => $event->{dtend}, offset => 0 ); + } my $icalduration = $icalstop - $ical; my $duration = join(":", $icalduration->hours || "0",