[BACK]Return to todo.pl CVS log [TXT][DIR] Up to [local] / todotxt / Text-Todo / bin

Diff for /todotxt/Text-Todo/bin/todo.pl between version 1.2 and 1.11

version 1.2, 2010/01/10 07:13:54 version 1.11, 2010/01/11 00:30:31
Line 1 
Line 1 
 #!/usr/bin/perl  #!/usr/bin/perl
 # $RedRiver: todo.pl,v 1.1 2010/01/09 05:25:44 andrew Exp $  # $RedRiver: todo.pl,v 1.9 2010/01/11 00:17:38 andrew Exp $
 ########################################################################  ########################################################################
 # todo.pl *** a perl version of todo.sh. Uses Text::Todo.  # todo.pl *** a perl version of todo.sh. Uses Text::Todo.
 #  #
Line 22 
Line 22 
   
 # option defaults  # option defaults
 my $config_file = $ENV{HOME} . '/todo.cfg';  my $config_file = $ENV{HOME} . '/todo.cfg';
   CONFIG: foreach my $f ( $config_file, $ENV{HOME} . '/.todo.cfg', ) {
       if ( -e $f ) {
           $config_file = $f;
           last CONFIG;
       }
   }
   
 my %actions = (  my %actions = (
     add      => \&unsupported,      add      => \&add,
     addto    => \&unsupported,      addto    => \&addto,
     append   => \&unsupported,      append   => \&append,
     archive  => \&unsupported,      archive  => \&archive,
     command  => \&unsupported,      command  => \&command,
     del      => \&unsupported,      del      => \&del,
     depri    => \&unsupported,      depri    => \&depri,
     do       => \&unsupported,      do       => \&mark_done,
     help     => \&unsupported,      help     => \&help,
     list     => \&list,      list     => \&list,
     listall  => \&unsupported,      listall  => \&listall,
     listcon  => \&unsupported,      listcon  => \&listcon,
     listfile => \&unsupported,      listfile => \&listfile,
     listpri  => \&unsupported,      listpri  => \&listpri,
     listproj => \&unsupported,      listproj => \&listproj,
     move     => \&unsupported,      move     => \&move,
     prepend  => \&unsupported,      prepend  => \&prepend,
     pri      => \&unsupported,      pri      => \&pri,
     replace  => \&unsupported,      replace  => \&replace,
     report   => \&unsupported,      report   => \&report,
 );  );
   
 my %aliases = (  my %aliases = (
Line 55 
Line 61 
     lsa   => 'listall',      lsa   => 'listall',
     lsc   => 'listcon',      lsc   => 'listcon',
     lf    => 'listfile',      lf    => 'listfile',
     lsp   => 'listri',      lsp   => 'listpri',
     lsprj => 'listproj',      lsprj => 'listproj',
     mv    => 'move',      mv    => 'move',
     prep  => 'prepend',      prep  => 'prepend',
Line 79 
Line 85 
     usage( $opts{h} );      usage( $opts{h} );
 }  }
   
 my @unsupported = grep { defined $opts{$_} } qw( @ + f h p P n t v V );  my @unsupported = grep { defined $opts{$_} } qw( @ + f h p P t v V );
 if (@unsupported) {  if (@unsupported) {
     die 'Unsupported options: ' . ( join q{, }, @unsupported ) . "\n";      warn 'Unsupported options: ' . ( join q{, }, @unsupported ) . "\n";
 }  }
   
 if ( $opts{d} ) {  if ( $opts{d} ) {
Line 96 
Line 102 
     usage();      usage();
 }  }
   
   sub add {
       my ( $config, @entry ) = @_;
       if ( !@entry ) {
           die "usage: todo.pl add 'item'\n";
       }
   
       my $entry = join q{ }, @entry;
   
       my $todo = Text::Todo->new($config);
       if ( $todo->add($entry) ) {
           my @list  = $todo->list;
           my $lines = scalar @list;
   
           print "TODO: '$entry' added on line $lines\n";
   
           return $lines;
       }
       die "Unable to add [$entry]\n";
   }
   
   sub addto {
       my ( $config, $file, @entry ) = @_;
       if ( !( $file && @entry ) ) {
           die "usage: todo.pl addto DEST 'TODO ITEM'\n";
       }
   
       my $entry = join q{ }, @entry;
   
       my $todo = Text::Todo->new($config);
   
       $file = $todo->file($file);
       if ( $todo->addto( $file, $entry ) ) {
           my @list  = $todo->listfile($file);
           my $lines = scalar @list;
   
           print "TODO: '$entry' added to $file on line $lines\n";
   
           return $lines;
       }
       die "Unable to add [$entry]\n";
   }
   
   sub append {
       my ( $config, $line, @text ) = @_;
       if ( !( $line && @text && $line =~ /^\d+$/xms ) ) {
           die 'usage: todo.pl append ITEM# "TEXT TO APPEND"' . "\n";
       }
   
       my $text = join q{ }, @text;
   
       my $todo  = Text::Todo->new($config);
       my $entry = $todo->list->[ $line - 1 ];
   
       if ( $entry->append($text) && $todo->save ) {
           return printf "%02d: %s\n", $line, $entry->text;
       }
       die "Unable to append\n";
   }
   
   sub archive {
       my ($config) = @_;
       my $todo = Text::Todo->new($config);
   
       my $file = $todo->file;
   
       my $archived = $todo->archive;
       if ( defined $archived ) {
           return print "TODO: $file archived.\n";
       }
       die "Unable to archive $file\n";
   }
   
   sub command { return &unsupported }
   
   sub del {
       my ( $config, $line ) = @_;
       if ( !( $line && $line =~ /^\d+$/xms ) ) {
           die 'usage: todo.pl del ITEM#' . "\n";
       }
       my $todo = Text::Todo->new($config);
   
       my $entry = $todo->list->[ $line - 1 ];
       print "Delete '" . $entry->text . "'?  (y/n)\n";
       warn "XXX No delete confirmation currently!\n";
   
       if ( $opts{n} ) {
           if ( $todo->del($entry) && $todo->save ) {
               return print 'TODO: \'', $entry->text, "' deleted.\n";
           }
       }
       else {
           my $text = $entry->text;
           if ( $entry->replace(q{}) && $todo->save ) {
               return print 'TODO: \'', $text, "' deleted.\n";
           }
       }
   
       die "Unable to delete entry\n";
   }
   
   sub depri {
       my ( $config, $line ) = @_;
       if ( !( $line && $line =~ /^\d+$/xms ) ) {
           die 'usage: todo.pl depri ITEM#' . "\n";
       }
       my $todo = Text::Todo->new($config);
   
       my $entry = $todo->list->[ $line - 1 ];
       if ( $entry->depri && $todo->save ) {
           return print $line, ': ', $entry->text, "\n",
               'TODO: ', $line, " deprioritized.\n";
       }
       die "Unable to deprioritize entry\n";
   }
   
   sub mark_done { return &unsupported }
   sub help      { return &unsupported }
   
 sub list {  sub list {
       my ( $config, $term ) = @_;
       my $todo = Text::Todo->new($config);
   
       my @list = _number_list( $todo->list );
       my $shown = _show_sorted_list( $term, @list );
   
       return _show_list_footer( $shown, scalar @list, $config->{todo_file} );
   }
   
   sub listall {
       my ( $config, $term ) = @_;
       my $todo = Text::Todo->new($config);
   
       my @list = _number_list(
           $todo->listfile('todo_file'),
           $todo->listfile('done_file'),
       );
       my $shown = _show_sorted_list( $term, @list );
   
       return _show_list_footer( $shown, scalar @list, $config->{'todo_dir'} );
   }
   
   sub listcon {
     my ($config) = @_;      my ($config) = @_;
     my $todo = Text::Todo->new($config);      my $todo = Text::Todo->new($config);
     $todo->load( $config->{todo_file} ) || die "Couldn't load todo_file\n";      return print map {"\@$_\n"} $todo->listcon;
   }
   
     foreach my $entry ( sort { lc $a->text cmp lc $b->text } $todo->list ) {  sub listfile {
         print $entry->text, "\n" or warn "Couldn't print: \n";      my ( $config, $file, $term ) = @_;
       if ( !$file ) {
           die "usage: todo.pl listfile SRC [TERM]\n";
     }      }
       my $todo = Text::Todo->new($config);
   
       my @list = _number_list( $todo->listfile($file) );
       my $shown = _show_sorted_list( $term, @list );
   
       return _show_list_footer( $shown, scalar @list, $file );
 }  }
   
   sub listpri {
       my ( $config, $pri ) = @_;
   
       my $todo = Text::Todo->new($config);
   
       my @list = _number_list( $todo->listfile('todo_file') );
       my @pri_list;
       if ($pri) {
           $pri = uc $pri;
           if ( $pri !~ /^[A-Z]$/xms ) {
               die "usage: todo.pl listpri PRIORITY\n",
                   "note: PRIORITY must a single letter from A to Z.\n";
           }
           @pri_list = grep {
               defined $_->{entry}->priority
                   && $_->{entry}->priority eq $pri
           } @list;
       }
       else {
           @pri_list = grep { $_->{entry}->priority } @list;
       }
   
       my $shown = _show_sorted_list( undef, @pri_list );
   
       return _show_list_footer( $shown, scalar @list, $config->{todo_file} );
   }
   
   sub listproj {
       my ($config) = @_;
       my $todo = Text::Todo->new($config);
       return print map {"\+$_\n"} $todo->listproj;
   }
   
   sub move { return &unsupported }
   
   sub prepend {
       my ( $config, $line, @text ) = @_;
       if ( !( $line && @text && $line =~ /^\d+$/xms ) ) {
           die 'usage: todo.pl prepend ITEM# "TEXT TO PREPEND"' . "\n";
       }
   
       my $text = join q{ }, @text;
   
       my $todo  = Text::Todo->new($config);
       my $entry = $todo->list->[ $line - 1 ];
   
       if ( $entry->prepend($text) && $todo->save ) {
           return printf "%02d: %s\n", $line, $entry->text;
       }
       die "Unable to prepend\n";
   }
   
   sub pri {
       my ( $config, $line, $priority ) = @_;
       my $error = 'usage: todo.pl pri ITEM# PRIORITY';
       if ( !( $line && $line =~ /^\d+$/xms && $priority ) ) {
           die $error;
       }
       if ( $priority !~ /^[A-Z]$/xms ) {
           die $error . "\n"
               . "note: PRIORITY must a single letter from A to Z.\n";
       }
   
       my $todo = Text::Todo->new($config);
   
       my $entry = $todo->list->[ $line - 1 ];
       if ( $entry->pri($priority) && $todo->save ) {
           return print $line, ': ', $entry->text, "\n",
               'TODO: ', $line, ' prioritized (', $entry->priority, ").\n";
       }
       die "Unable to prioritize entry\n";
   }
   
   sub replace { return &unsupported }
   sub report  { return &unsupported }
   
   sub _number_list {
       my (@list) = @_;
   
       my $line = 1;
       return map { { line => $line++, entry => $_, } } @list;
   }
   
   sub _show_sorted_list {
       my ( $term, @list ) = @_;
       $term = defined $term ? quotemeta($term) : '';
   
       my $shown = 0;
       my @sorted = map { sprintf "%02d %s", $_->{line}, $_->{entry}->text }
           sort { lc $a->{entry}->text cmp lc $b->{entry}->text } @list;
   
       foreach my $line ( grep {/$term/xms} @sorted ) {
           print $line, "\n";
           $shown++;
       }
   
       return $shown;
   }
   
   sub _show_list_footer {
       my ( $shown, $total, $file ) = @_;
   
       $shown ||= 0;
       $total ||= 0;
   
       print "-- \n";
       print "TODO: $shown of $total tasks shown from $file\n";
   
       return 1;
   }
   
 sub unsupported { die "Unsupported action\n" }  sub unsupported { die "Unsupported action\n" }
   
 sub usage {  sub usage {
Line 114 
Line 381 
     print <<'EOL';      print <<'EOL';
   * command list taken from todo.sh for compatibility    * command list taken from todo.sh for compatibility
   Usage: todo.pl [-fhpantvV] [-d todo_config] action    Usage: todo.pl [-fhpantvV] [-d todo_config] action
   
 EOL  EOL
   
     if ($long) {      if ($long) {
         print <<'EOL';          print <<'EOL';
   
   Actions:    Actions:
     add|a "THING I NEED TO DO +project @context"      add|a "THING I NEED TO DO +project @context"
     addto DEST "TEXT TO ADD"      addto DEST "TEXT TO ADD"
Line 155 
Line 422 
     my ($file) = @_;      my ($file) = @_;
   
     my %config;      my %config;
     open my $fh, '<', $file or die "Unable to open [$file]: $!";      open my $fh, '<', $file or die "Unable to open [$file] : $!";
 LINE: while (<$fh>) {  LINE: while (<$fh>) {
         s/\r?\n$//xms;          s/\r?\n$//xms;
         s/\s*\#.*$//xms;          s/\s*\#.*$//xms;

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.11

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>