[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.13 and 1.25

version 1.13, 2010/01/10 07:07:46 version 1.25, 2010/02/13 23:26:44
Line 1 
Line 1 
 package Text::Todo;  package Text::Todo;
   
 # $RedRiver: Todo.pm,v 1.12 2010/01/10 04:08:59 andrew Exp $  # $AFresh1: Todo.pm,v 1.24 2010/01/22 18:15:06 andrew Exp $
   
 use warnings;  use warnings;
 use strict;  use strict;
Line 10 
Line 10 
 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.1.1');
   
 {  {
   
     my %path_of;      my @attr_refs = \(
     my %list_of;          my %path_of,
     my %loaded_of;  
   
           my %list_of,
           my %loaded_of,
           my %known_tags_of,
       );
   
     sub new {      sub new {
         my ( $class, $options ) = @_;          my ( $class, $options ) = @_;
   
Line 25 
Line 29 
         my $ident = ident($self);          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,
         };          };
   
           $known_tags_of{$ident} = {
               context => '@',
               project => '+',
           };
   
         if ($options) {          if ($options) {
             if ( ref $options eq 'HASH' ) {              if ( ref $options eq 'HASH' ) {
                 foreach my $opt ( keys %{$options} ) {                  foreach my $opt ( keys %{$options} ) {
                     if ( exists $path_of{$ident}{$opt} ) {                      if ( exists $path_of{$ident}{$opt} ) {
                         $self->_path_to( $opt, $options->{$opt} );                          $self->_path_to( $opt, $options->{$opt} );
                     }                      }
                       elsif ( $opt eq 'tags' ) {
                           foreach my $tag ( keys %{ $options->{$opt} } ) {
                               $known_tags_of{$ident}{$tag}
                                   = $options->{$opt}{$tag};
                           }
                       }
                     else {                      else {
   
                         #carp "Invalid option [$opt]";                          #carp "Invalid option [$opt]";
                     }                      }
                 }                  }
Line 196 
Line 212 
     }      }
   
     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 208 
Line 235 
         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,
                       tags => $self->_known_tags,
                   }
               );
         }          }
         elsif ( ref $entry ne 'Text::Todo::Entry' ) {          elsif ( ref $entry ne 'Text::Todo::Entry' ) {
             croak(              croak(
Line 248 
Line 279 
     }      }
   
     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 _known_tags {
           my ($self) = @_;
           my $ident = ident($self);
   
           my @list = $self->list;
   
           foreach my $e (@list) {
               my $kt = $e->known_tags;
               foreach my $t ( keys %{$kt} ) {
                   if ( !exists $known_tags_of{$ident}{$t} ) {
                       $known_tags_of{$ident}{$t} = $kt->{$t};
                   }
               }
           }
   
           return $known_tags_of{$ident};
       }
   
       sub listtags {
           my ($self) = @_;
           my $ident = ident($self);
   
           my @list = sort keys %{ $self->_known_tags };
   
           return wantarray ? @list : \@list;
       }
   
     sub archive {      sub archive {
         my ($self) = @_;          my ($self) = @_;
         my $ident = ident($self);          my $ident = ident($self);
Line 285 
Line 355 
                     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 358 
Line 428 
   
         croak "Invalid entry [$entry]!";          croak "Invalid entry [$entry]!";
     }      }
   
       sub DESTROY {
           my ($self) = @_;
           my $ident = ident $self;
   
           foreach my $attr_ref (@attr_refs) {
               delete $attr_ref->{$ident};
           }
   
           return;
       }
 }  }
   
 1;    # Magic true value required at end of module  1;    # Magic true value required at end of module
Line 365 
Line 446 
   
 =head1 NAME  =head1 NAME
   
 Text::Todo - Perl interface to todo_txt files  Text::Todo - Perl interface to todotxt files
   
   
 =head1 VERSION  =head1 VERSION
Line 446 
Line 527 
 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 454 
Line 536 
 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 listtags
   
   Returns a list of the tags known to the list.
   
   =head2 listtag($tag)
   
   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
   

Legend:
Removed from v.1.13  
changed lines
  Added in v.1.25

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