Hiermit gebe ich meine Demo frei, die mir vorliegende Version ist schon um einige Funktionen reicher. Wichtig ist mir allerdings Feedback bzgl. gewünschter Funktionen und eventuell vorhandener Fehler.
Mir ist bewusst, dass die Farbdarstellung unter Windows nicht funktionieren wird. Das liegt an der activeperl-Implemention von ANSI::Color.
- Code: Select all
#!/usr/bin/perl -w
use strict;
use Switch;
use vars qw(@date @beschreibung @comment @done @whole); #Globale Variablen der Datensätze
use Term::ANSIColor qw(:constants); #weils bunt viel schöner ist
sub handler #Handler
{
switch(shift)
{
#good
case "header1" { return BOLD,UNDERLINE"Todolist",RESET }
case "header2" { return "\n ",RED,UNDERLINE,"Nr.\tTermin\t\tBeschreibung",RESET,"\n" }
case "del_suc" { return "\tgelöscht.\n" }
case "del_mar" { return "Erfolgreich zum Löschen markiert!\nBestätigen mit save.\n" }
case "create_header" { return BOLD,"Neuer Eintrag\n\n",RESET }
case "create_date" { return "Termin? (tt.mm.yyyy):\t" }
case "create_besch" { return "Beschreibung?\t\t" }
case "create_com" { return "Comment?\t\t" }
#the bad
case "404" { return YELLOW,BOLD,"Eintrag nicht vorhanden.\n",RESET }
case "cmd_unknown" { return YELLOW,BOLD,"Befehl unbekannt - help zeigt Befehle!\n",RESET }
case "wrong_date" { return YELLOW,BOLD,"Falsche Datumsangabe! Bitte erneut eingeben!\n",RESET }
case "mal_chars" { return YELLOW,BOLD,"Verbotene Zeichen gefunden! Bitte erneut eingeben!\n",RESET }
case "help" { return UNDERLINE,"Befehle",RESET,"\n help\t - zeigt diese Hilfe\n",
" exit\t - beendet das Script\n",
" del\t - loescht den Einzeleintrag\n",
" ls\t - listet den Einzeleintrag\n",
" new\t - legt einen neuen Einzeleintrag an\n",
" refresh - aktualisiert die Todoliste\n" }
#and the evil
else { return BOLD,RED,"Go and hang the scripter!\n",RESET }
}
}
sub create #Datensatz anlegen
{
clear();
print handler("create_header");
$date[scalar @date] = format_date();
$beschreibung[scalar @beschreibung] = format_input("create_besch");
$comment[scalar @comment] = format_input("create_com");
$done[scalar @done] = 0;
}
sub format_input #Den neuen Eintrags formatieren
{
my $handler = shift or die handler();
print handler($handler);
my $input = <STDIN>;
chomp($input);
if($input=~/[\[\]{}()\/]/)
{
print handler("mal_chars");
format_input($handler);
}
else
{
return $input;
}
}
sub format_date #Datum formatieren
{
print handler("create_date");
my $date=<STDIN>;
chomp($date);
if($date=~/^(\d\d)\.(\d\d)\.(\d\d\d\d)$/)
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
$year+=1900;
$mon+=1;
if( int($1)gt 31 or int($1)lt 1 or int($2)gt 12 or int($2)lt 1 or int($3) lt $year or (int($3) eq $year and int($2) lt $mon ) or
(int($3) eq $year and int($2) eq $mon and int($1) lt $mday)) { print handler("wrong_date"); format_date() }
else
{
return $1."\|".$2."\|".(int($3)-1900);
}
}
else
{
print handler("wrong_date");
format_date();
}
}
sub in #Daten einlesen
{
my $open_file = "todo.txt";
open (FILE, $open_file) or die $!;
while (<FILE>)
{
($date[$.-1], $beschreibung[$.-1], $comment[$.-1], $done[$.-1]) = split /\\/, $_;
}
close FILE;
}
sub out #Daten niederschreiben
{
open OUT, ">", "todo.txt" or die $!;
for my $i (0 .. @date-1)
{
if($whole[0][$i]=~/^delete$/)
{
print $i,handler("del_suc");
}
else
{
print OUT $date[$i]."\\".$beschreibung[$i]."\\".$comment[$i]."\\".$done[$i]."\\\n";
}
}
close OUT;
}
sub ausgabe #Ausgabe erzeugen
{
clear();
print handler("header1");
print handler("header2");
for my $i (0 .. @date-1)
{
print "\n ",$i,"\t",get_entry_time($i),"\t",$whole[1][$i];
}
print "\n\n";
user_input();
}
sub get_entry_time #Zeitausgabe
{
$whole[0][shift] =~ /(\d+)\|(\d+)\|(\d+)/;
return $1.".".$2.".",$3+1900;
}
#Init
sub init
{
#Alles defaulten
@date = ();
@beschreibung =();
@comment = ();
@done = ();
@whole = ();
in(); #Arrays füllen
@whole = (\@date,\@beschreibung,\@comment,\@done); #Referenzieren
}
sub del #Löschen
{
$whole[0][shift]="delete";
return handler("del_mar");
}
sub user_input #Benutzereingabe
{
print "> ";
my $ip = <STDIN>;
chomp($ip);
if($ip=~/^([a-zA-Z]+)\s([0-9]+)$/g){
switch($1)
{
case "ls" { print list($2) }
case "del" { print del($2) }
else { print handler("cmd_unknown") }
}
}
else{
switch($ip)
{
case "help" { print handler("help") }
case "refresh" { init(); ausgabe() }
case "new" { create(); out() }
case "exit" { clear(); exit }
case "save" { out() }
else { print handler("cmd_unknown") }
}
}
user_input();
}
sub list #Detailansicht
{
my $i = shift;
if($i>=@date)
{
return handler("404");
}
else
{
return
" Beschreibung:\t",$whole[1][$i],"
Termin:\t",get_entry_time($i),"
Kommentar:\t",$whole[2][$i],"\n";
}
}
sub clear #Etwas Shampoo gefällig?
{
system('clear');
}
init();
ausgabe();
Quelltext ist weitesgehend kommentiert.
Ihr solltet eine simple, leere Textdatei in den Ordner des Scriptes packen.


