[BACK]Return to Todo.pm CVS log [TXT][DIR] Up to [local] / todotxt / Text-Todo / lib / Text

Diff for /todotxt/Text-Todo/lib/Text/Todo.pm between version 1.12 and 1.18

version 1.12, 2010/01/10 04:08:59 version 1.18, 2010/01/18 00:19:55
Line 1 
Line 1 
 package Text::Todo;  package Text::Todo;
   
 # $RedRiver: Todo.pm,v 1.11 2010/01/10 01:01:45 andrew Exp $  # $AFresh1: Todo.pm,v 1.17 2010/01/12 20:09:02 andrew Exp $
   
 use warnings;  use warnings;
 use strict;  use strict;
 use Carp;  use Carp;
   
 use Class::Std::Utils;  use Class::Std;
 use Text::Todo::Entry;  use Text::Todo::Entry;
 use File::Spec;  use File::Spec;
   
 use version; our $VERSION = qv('0.0.1');  use version; our $VERSION = qv('0.0.1');
   
 {  {
       my ( %path_of, %list_of, %loaded_of, ) : ATTR;
   
     my %path_of;      sub BUILD {
     my %list_of;          my ( $self, $ident, $options ) = @_;
     my %loaded_of;  
   
     sub new {  
         my ( $class, $options ) = @_;  
   
         my $self = bless anon_scalar(), $class;  
         my $ident = ident($self);  
   
         $path_of{$ident} = {          $path_of{$ident} = {
             todo_dir    => undef,              todo_dir  => undef,
             todo_file   => 'todo.txt',              todo_file => 'todo.txt',
             done_file   => undef,              done_file => undef,
             report_file => undef,  
         };          };
   
         if ($options) {          if ($options) {
Line 38 
Line 31 
                         $self->_path_to( $opt, $options->{$opt} );                          $self->_path_to( $opt, $options->{$opt} );
                     }                      }
                     else {                      else {
                         carp "Invalid option [$opt]";  
                           #carp "Invalid option [$opt]";
                     }                      }
                 }                  }
             }              }
Line 160 
Line 154 
         open my $fh, '<', $file or croak "Couldn't open [$file]: $!";          open my $fh, '<', $file or croak "Couldn't open [$file]: $!";
         while (<$fh>) {          while (<$fh>) {
             s/\r?\n$//xms;              s/\r?\n$//xms;
             push @list, Text::Todo::Entry->new($_);              push @list, Text::Todo::Entry->new({ text => $_ });
         }          }
         close $fh or croak "Couldn't close [$file]: $!";          close $fh or croak "Couldn't close [$file]: $!";
   
Line 197 
Line 191 
     }      }
   
     sub listpri {      sub listpri {
         my ($self) = @_;          my ( $self, $pri ) = @_;
   
         my @list = grep { $_->priority } $self->list;          my @list;
           if ($pri) {
               $pri = uc $pri;
               if ( $pri !~ /^[A-Z]$/xms ) {
                   croak 'PRIORITY must a single letter from A to Z.';
               }
               @list = grep { defined $_->priority && $_->priority eq $pri }
                   $self->list;
           }
           else {
               @list = grep { $_->priority } $self->list;
           }
   
         return wantarray ? @list : \@list;          return wantarray ? @list : \@list;
     }      }
Line 209 
Line 214 
         my $ident = ident($self);          my $ident = ident($self);
   
         if ( !ref $entry ) {          if ( !ref $entry ) {
             $entry = Text::Todo::Entry->new($entry);              $entry = Text::Todo::Entry->new({ text => $entry });
         }          }
         elsif ( ref $entry ne 'Text::Todo::Entry' ) {          elsif ( ref $entry ne 'Text::Todo::Entry' ) {
             croak(              croak(
Line 249 
Line 254 
     }      }
   
     sub listproj {      sub listproj {
         my ( $self, $entry, $dst ) = @_;          my ($self) = @_;
           return $self->listtag('project');
       }
   
       sub listcon {
           my ($self) = @_;
           return $self->listtag('context');
       }
   
       sub listtag {
           my ( $self, $tag ) = @_;
         my $ident = ident($self);          my $ident = ident($self);
   
         my %available_projects;          my $accessor = $tag . 's';
   
           my %available;
         foreach my $e ( $self->list ) {          foreach my $e ( $self->list ) {
             foreach my $p ( $e->projects ) {              foreach my $p ( $e->$accessor ) {
                 $available_projects{$p} = 1;                  $available{$p} = 1;
             }              }
         }          }
   
         my @projects = sort keys %available_projects;          my @tags = sort keys %available;
   
         return wantarray ? @projects : \@projects;          return wantarray ? @tags : \@tags;
     }      }
   
     sub archive {      sub archive {
Line 286 
Line 303 
                     last ENTRY;                      last ENTRY;
                 }                  }
             }              }
             elsif ($e->text eq q{}) {              elsif ( $e->text eq q{} ) {
                 if ($self->del($e)) {                  if ( $self->del($e) ) {
                     $changed++;                      $changed++;
                 }                  }
                 else {                  else {
Line 405 
Line 422 
   
 =head1 INTERFACE  =head1 INTERFACE
   
 =head2 new  =head2 BUILD
   
     new({      new({
         [ todo_dir    => 'directory', ]          [ todo_dir    => 'directory', ]
Line 416 
Line 433 
   
 Allows you to set each item individually.  todo_file defaults to todo.txt.  Allows you to set each item individually.  todo_file defaults to todo.txt.
   
     new('path/to/todo.txt');      new({ todo_file => 'path/to/todo.txt');
   
 Automatically sets todo_dir to 'path/to', todo_file to 'todo.txt'  Automatically sets todo_dir to 'path/to', todo_file to 'todo.txt'
   
     new('path/to')  
   
 If you pass an existing directory to new, it will set todo_dir.  
   
   
 If you what you set matches (.*)todo(.*).txt it will automatically set  If you what you set matches (.*)todo(.*).txt it will automatically set
 done_file to $1done$2.txt  done_file to $1done$2.txt
 and  and
Line 447 
Line 459 
 then, $todo_file eq 'todo/todo.txt'  then, $todo_file eq 'todo/todo.txt'
   
 =head2 load  =head2 load
   - Reads a list from a file into the current object.
   
 Allows you to load a different file into the object.  Allows you to load a different file into the object.
   
Line 455 
Line 468 
 This effects the other functions that act on the list.  This effects the other functions that act on the list.
   
 =head2 save  =head2 save
   - Writes the list to disk.
   
     $todo->save(['new/path/to/todo']);      $todo->save(['new/path/to/todo']);
   
 Writes the list to the file. Either the current working file or something  Either writes the current working file or the passed in argument
 that can be recognized by file().  that can be recognized by file().
   
 If you specify a filename it will save to that file and update the paths.  If you specify a filename it will save to that file and update the paths.
 Additional changes to the object work on that file.  Additional changes to the object work on that file.
   
 =head2 list  =head2 list
   - get the curently loaded list
   
     my @todo_list = $todo->list;      my @todo_list = $todo->list;
   
   In list context returns a list, it scalar context returns an array reference to the list.
   
 =head2 listpri  =head2 listpri
   - get the list items that are marked priority
   
 Like list, but only returns entries that have priority set.  Like list, but only returns entries that have priority set.
   
     my @priority_list = $todo->listpri;      my @priority_list = $todo->listpri;
   
 =head2 listproj  Since this is so easy to write as:
   
 Returns projects in the list sorted by name.      my @priority_list = grep { $_->priority } $todo->list;
 If there were projects +GarageSale and +Shopping  
   
     my @projects = $todo->listproj;  I think it may become depreciated unless there is demand.
   
   =head2 listtag
   
   Returns tags found in the list sorted by name.
   
   If there were projects +GarageSale and +Shopping then
   
       my @projects = $todo->listtag('project');
   
 is the same as  is the same as
   
     @projects = ( 'GarageSale', 'Shopping' );      @projects = ( 'GarageSale', 'Shopping' );
   
   =head2 listcon
   - Shortcut to listtag('context')
   
   =head2 listproj
   - Shortcut to listtag('project')
   
 =head2 add  =head2 add
   
 Adds a new entry to the list.  Adds a new entry to the list.
Line 561 
Line 592 
   
 =head1 DEPENDENCIES  =head1 DEPENDENCIES
   
 Class::Std::Utils  Class::Std
 File::Spec  File::Spec
 version  version
   

Legend:
Removed from v.1.12  
changed lines
  Added in v.1.18

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