[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.18 and 1.27

version 1.18, 2010/01/18 00:19:55 version 1.27, 2010/02/16 01:13:12
Line 1 
Line 1 
 package Text::Todo;  package Text::Todo;
   
 # $AFresh1: Todo.pm,v 1.17 2010/01/12 20:09:02 andrew Exp $  # $AFresh1: Todo.pm,v 1.26 2010/02/14 06:08:07 andrew Exp $
   
 use warnings;  use warnings;
 use strict;  use strict;
 use Carp;  use Carp;
   
 use Class::Std;  use Class::Std::Utils;
 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.2.0');
   
 {  {
     my ( %path_of, %list_of, %loaded_of, ) : ATTR;  
   
     sub BUILD {      my @attr_refs = \(
         my ( $self, $ident, $options ) = @_;          my %path_of,
   
           my %list_of,
           my %loaded_of,
           my %known_tags_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,
         };          };
   
           my %tags = (
               context => q{@},
               project => q{+},
           );
   
         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'
                           && ref $options->{$opt} eq 'HASH' )
                       {
                           %tags = ( %tags, %{ $options->{$opt} } );
                       }
                     else {                      else {
   
                         #carp "Invalid option [$opt]";                          #carp "Invalid option [$opt]";
Line 49 
Line 69 
             }              }
         }          }
   
           $known_tags_of{$ident} = \%tags;
   
         my $file = $self->_path_to('todo_file');          my $file = $self->_path_to('todo_file');
         if ( defined $file && -e $file ) {          if ( defined $file && -e $file ) {
             $self->load();              $self->load();
Line 128 
Line 150 
         $file = $self->file($file);          $file = $self->file($file);
   
         if ( $list_of{$ident} = $self->listfile($file) ) {          if ( $list_of{$ident} = $self->listfile($file) ) {
               $self->known_tags;
             $loaded_of{$ident} = $file;              $loaded_of{$ident} = $file;
             return 1;              return 1;
         }          }
Line 154 
Line 177 
         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({ text => $_ });              push @list, Text::Todo::Entry->new($_);
         }          }
         close $fh or croak "Couldn't close [$file]: $!";          close $fh or croak "Couldn't close [$file]: $!";
   
Line 214 
Line 237 
         my $ident = ident($self);          my $ident = ident($self);
   
         if ( !ref $entry ) {          if ( !ref $entry ) {
             $entry = Text::Todo::Entry->new({ text => $entry });              $entry = Text::Todo::Entry->new(
                   {   text => $entry,
                       tags => $known_tags_of{$ident},
                   }
               );
         }          }
         elsif ( ref $entry ne 'Text::Todo::Entry' ) {          elsif ( ref $entry ne 'Text::Todo::Entry' ) {
             croak(              croak(
Line 223 
Line 250 
   
         push @{ $list_of{$ident} }, $entry;          push @{ $list_of{$ident} }, $entry;
   
           $self->known_tags;
   
         return $entry;          return $entry;
     }      }
   
Line 281 
Line 310 
         return wantarray ? @tags : \@tags;          return wantarray ? @tags : \@tags;
     }      }
   
       sub learn_tag {
           my ( $self, $tag, $sigal ) = @_;
   
           $known_tags_of{ ident $self}{$tag} = $sigal;
           $self->known_tags;
   
           return 1;
       }
   
       sub known_tags {
           my ($self) = @_;
           my $ident = ident($self);
   
           my @list = $self->list;
           my %tags = %{ $known_tags_of{$ident} };
   
           foreach my $e (@list) {
               my $kt = $e->known_tags;
               foreach my $t ( keys %{$kt} ) {
                   if ( !exists $tags{$t} ) {
                       $tags{$t} = $kt->{$t};
                   }
               }
           }
   
           foreach my $e (@list) {
               my $kt = $e->known_tags;
               foreach my $t ( keys %tags ) {
                   if ( !exists $kt->{$t} || $tags{$t} ne $kt->{$t} ) {
                       $e->learn_tag( $t, $tags{$t} );
                   }
               }
           }
   
           $known_tags_of{$ident} = \%tags;
   
           return $known_tags_of{$ident};
       }
   
     sub archive {      sub archive {
         my ($self) = @_;          my ($self) = @_;
         my $ident = ident($self);          my $ident = ident($self);
Line 376 
Line 444 
   
         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 383 
Line 462 
   
 =head1 NAME  =head1 NAME
   
 Text::Todo - Perl interface to todo_txt files  Text::Todo - Perl interface to todotxt files
   
   
 =head1 VERSION  =head1 VERSION
Line 422 
Line 501 
   
 =head1 INTERFACE  =head1 INTERFACE
   
 =head2 BUILD  =head2 new
   
     new({      new({
         [ todo_dir    => 'directory', ]          [ todo_dir    => 'directory', ]
Line 433 
Line 512 
   
 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({ todo_file => 'path/to/todo.txt');      new('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 498 
Line 582 
   
 I think it may become depreciated unless there is demand.  I think it may become depreciated unless there is demand.
   
 =head2 listtag  =head2 known_tags
   
   Returns a reference to a hash of the tags known to the list.
   
   =head2 learn_tag($tag, $sigal)
   
   Let the entire list learn a new tag.
   If you are working with a list you should use this instead of
   $entry->learn_tag because it will update all entries.
   
   =head2 listtag($tag)
   
 Returns tags found in the list sorted by name.  Returns tags found in the list sorted by name.
   
 If there were projects +GarageSale and +Shopping then  If there were projects +GarageSale and +Shopping then
Line 592 
Line 686 
   
 =head1 DEPENDENCIES  =head1 DEPENDENCIES
   
 Class::Std  Class::Std::Utils
 File::Spec  File::Spec
 version  version
   

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

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