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;