[PERL] Todolist

Alles rund um Linux.

[PERL] Todolist

Postby Silas » 14.11.2008, 12:38

Für Menschen, die viel um die Ohren haben, aber keine Lust auf komplexe Programme!

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.
Linux Maggy 2.6-gentoo #1 SMP Tue May 13 03:05:04 CEST 2008 x86_64 AMD Turion(tm) 64 X2 Mobile Technology TL-56 AuthenticAMD GNU/Linux
Silas
Securityvision Crew
 
Posts: 86
Joined: 13.03.2008, 17:40

Re: [PERL] Todolist

Postby IsNull » 16.11.2008, 10:06

Du bist ja ganz ein schlimmer, macht der ne ToDO List für die shell :shock: :mrgreen:

würde noch anmerken, dass die txt "todo.txt" heissen muss, sonst gehts nicht. :)
Image
User avatar
IsNull
Site Admin
 
Posts: 414
Joined: 05.09.2007, 15:36
Location: CH

Re: [PERL] Todolist

Postby Silas » 18.11.2008, 14:27

IsNull wrote:Du bist ja ganz ein schlimmer, macht der ne ToDO List für die shell :shock: :mrgreen:

würde noch anmerken, dass die txt "todo.txt" heissen muss, sonst gehts nicht. :)


Irgendwas muss man ja schreiben :D

Hm, stimmt, daran habe ich garnicht gedacht. Ist wie Betriebsblindheit...
Linux Maggy 2.6-gentoo #1 SMP Tue May 13 03:05:04 CEST 2008 x86_64 AMD Turion(tm) 64 X2 Mobile Technology TL-56 AuthenticAMD GNU/Linux
Silas
Securityvision Crew
 
Posts: 86
Joined: 13.03.2008, 17:40


Return to Linux

Who is online

Users browsing this forum: No registered users and 1 guest

cron