=================================================================== RCS file: /cvs/todotxt/Text-Todo/bin/todo.pl,v retrieving revision 1.4 retrieving revision 1.11 diff -u -r1.4 -r1.11 --- todotxt/Text-Todo/bin/todo.pl 2010/01/10 23:26:04 1.4 +++ todotxt/Text-Todo/bin/todo.pl 2010/01/11 00:30:31 1.11 @@ -1,5 +1,5 @@ #!/usr/bin/perl -# $RedRiver: todo.pl,v 1.3 2010/01/10 22:59:16 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. # @@ -85,7 +85,7 @@ 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) { warn 'Unsupported options: ' . ( join q{, }, @unsupported ) . "\n"; } @@ -103,11 +103,13 @@ } sub add { - my ( $config, $entry ) = @_; - if ( !$entry ) { + 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; @@ -121,11 +123,13 @@ } sub addto { - my ( $config, $file, $entry ) = @_; - if ( !( $file && $entry ) ) { + 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); @@ -141,11 +145,13 @@ } sub append { - my ( $config, $line, $text ) = @_; - if ( !( $line && $text && $line =~ /^\d+$/xms ) ) { + 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 ]; @@ -155,10 +161,62 @@ die "Unable to append\n"; } -sub archive { return &unsupported } -sub command { return &unsupported } -sub del { return &unsupported } -sub depri { return &unsupported } +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 } @@ -237,9 +295,46 @@ return print map {"\+$_\n"} $todo->listproj; } -sub move { return &unsupported } -sub prepend { return &unsupported } -sub pri { return &unsupported } +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 } @@ -255,8 +350,7 @@ $term = defined $term ? quotemeta($term) : ''; my $shown = 0; - my @sorted - = map { sprintf "%02d %s", $_->{line}, $_->{entry}->text } + 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 ) { @@ -328,7 +422,7 @@ my ($file) = @_; 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>) { s/\r?\n$//xms; s/\s*\#.*$//xms;