BSD-Wiki

Mitschrift einer FreeBSD-Installation

Benutzer-Werkzeuge

Webseiten-Werkzeuge


ical2remind.pl

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu der Vergleichsansicht

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>​
  
ical2remind.pl.txt · Zuletzt geändert: 2017/10/02 13:40 (Externe Bearbeitung)

Impressum