Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
— |
ical2remind.pl [2017/10/02 13:40] (aktuell) |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | 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. | ||
+ | |||
+ | <code> | ||
+ | #!/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; | ||
+ | |||
+ | </code> | ||