Das Programm deskutils/remind ist ein recht flexibles Kalenderprogramm für die Konsole, welches sich jedoch auch per grafischem Frontend bedienen lässt. Das folgende Perl-Script nimmt eine iCalendar-Datei als Inputstream und erzeugt daraus einen Eintrag in der Datei ~/.reminders-ical welche per INCLUDE-Anweisung in die ~/.reminders eingefügt werden kann. #!/usr/bin/perl # # Dieses Programm nimmt iCalendar-Dateien entgegen und schreibt darin enthaltene # Termine in die Datei ~/.reminder-ical, welche per INCLUDE in die ~/.reminder # eingefuegt werden kann. # # Author: Martin Kropfinger # use Time::Local; $version = "0.02"; @langermonat = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ); @langerwochentag = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); #################################################################################### sub setzerules{ \t# \t# Einlesen welche RRULEs vorhanden sind (Wiederkehrende Termine) \t# \t$rules = $_[0]; \tif ($rules =~ /FREQ=([A-Z]*)/){ \t\t$freq{$1} = 1; \t} \tif ($rules =~ /UNTIL=([0-9TZ]*)/){ \t\t$until = $1; \t} }; #################################################################################### sub timefrom{ \t# \t# Wandelt die iCalendar-Zeit in Unix-Zeit um und liefert diese zurueck \t# Hierueber werden UTC und Localtime abgefangen \t# \t$otime = $_[0]; \t$otime=~/^.*(\\d\\d\\d\\d)(\\d\\d)(\\d\\d)T(\\d\\d)(\\d\\d)(\\d\\d)(Z?)$/; \tif ($7 eq "Z"){ \t\t$zeit = timegm($6, $5, $4, $3, $2-1, $1-1900); \t} \telse{ \t\t$zeit = timelocal($6, $5, $4, $3, $2-1, $1-1900); \t} \t$zeit; } #################################################################################### # Suchen nach Schuesselworten in der iCalendar-Datei foreach(<>){ \tif (/^\\s*BEGIN:VEVENT\\s*$/) { \t\t$beginevent=1; \t} \tif ($beginevent){ \t\tif (/^DTSTART\\s*(\\S+)\\s*$/) { \t\t\t\t$q = $1; \t\t\t\t$beginn = &timefrom($q); \t\t} \t\tif (/^\\s*DTEND\\s*(\\S+)\\s*$/){ \t\t\t$q = $1; \t\t\t\t$ende = &timefrom($q); \t\t} \t\tif (/^\\s*SUMMARY:\\s*(.*)\\s*$/){ \t\t\t$betreff = $1; \t\t} \t\tif(/^\\s*RRULE:(.*)\\s*$/){ \t\t\t$q = $1; \t\t\t&setzerules($q); \t\t} \t} } # Anpassen der Unix-Zeit fuer Beginn und Ende auf lesbare Zeit im ARRAY @beginn = localtime($beginn); $beginn[5] += 1900; @ende = localtime($ende); $ende[5] += 1900; # Testen ob es sich um GanztagesTermine handelt (von 0:00 bis 0:00) if (($beginn[1]==0) and ($beginn[2]==0) and ($ende[1]==0) and ($ende[2]==0)){ \t$ganztag = 1; } # Testen ob der Termin am selben Tag endet wie er beginnt if (($beginn[5] eq $ende[5]) and ($beginn[4] eq $ende[4]) and ($beginn[3] eq $ende[3])){ \t$eintag = 1; } ### Aufbauen der Ausgabezeile $output = "REM ";\t# Beginn # wiederkehrende Ereignisse if ($freq{DAILY}){ \t$output = $output . "$beginn[3] $langermonat[$beginn[4]] $beginn[5] *1 "; } elsif ($freq{WEEKLY}){ \t$output = $output . "$langerwochentag[$beginn[6]] "; } elsif ($freq{YEARLY}){ \t$output = $output . "$beginn[3] $langermonat[$beginn[4]] "; } elsif($freq{MONTHLY}){ \t$output = $output . "$beginn[3] "; } else{ # Normaler Termin / keine Wiederholungen \t$output = "REM $beginn[3] $langermonat[$beginn[4]] $beginn[5] "; } # Sollte ein UNTIL gesetzt sein wird es nun ausgewertet if ($until){ \t$untildate = &timefrom($until); \t@untildate = localtime($untildate); \t$untildate[5] += 1900; \t$output = $output . "UNTIL $untildate[3] $langermonat[$untildate[4]] $untildate[5] "; } # Auswerten der normalen Beginn- und Endzeiten if ($ganztag and $eintag){ # Eintaegige Ereignisse brauchen keine weiteren Ergaenzungen \t$output = $output . ""; } elsif($ganztag and (not($eintag))){ # Mehrtaegige Ganztagsveranstaltungen \tunless ($freq{DAILY} or $freq{WEEKLY} or $freq{MONTHLY} or $freq{YEARLY}){ \t\t$vortag_ende = $ende[3] -1; \t\t$output = $output . "*1 UNTIL $vortag_ende $langermonat[$ende[4]] $ende[5] "; \t} } elsif((not($ganztag))){ # Termine die KEINE Ganztagstermine sind \t$zeitdifferenz = $ende - $beginn; \t($diffsec,$diffmin,$diffstd)=(gmtime($zeitdifferenz)); \t$output = $output . "AT $beginn[2]:$beginn[1] DURATION $diffstd:$diffmin "; } # Hinzufuegen des Betreff $output = $output . "MSG $betreff"; ## Schreiben in die Datei open FILE, ">>", "$ENV{HOME}/.reminders-ical" or die $!; print FILE "$output\ "; close FILE; 0;