]> pere.pagekite.me Git - homepage.git/blobdiff - linux/plan2icalendar
Generated.
[homepage.git] / linux / plan2icalendar
index f128ab088837b34c1094fac2c11ac3fe7c6470b4..ad051624b2cd7c74a8b92fe4f8b06e2491bda2e4 100755 (executable)
@@ -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 (<ICALENDAR>) {
-       chomp;
-       if (m/^BEGIN:VEVENT/) {
-           my %event;
-           while (<ICALENDAR>) {
-               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 (<ICALENDAR>) {
+                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/Ã\85/Å/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",