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

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

version 1.12, 2010/01/10 00:13:14 version 1.14, 2010/01/10 01:41:40
Line 1 
Line 1 
 package Text::Todo::Entry;  package Text::Todo::Entry;
   
 # $RedRiver: Entry.pm,v 1.11 2010/01/09 07:08:45 andrew Exp $  # $RedRiver: Entry.pm,v 1.13 2010/01/10 01:03:02 andrew Exp $
   
 use warnings;  use warnings;
 use strict;  use strict;
Line 17 
Line 17 
     my %tags_of;      my %tags_of;
     my %priority_of;      my %priority_of;
     my %completion_status_of;      my %completion_status_of;
       my %known_tags_of;
   
     my %tags = (  
         context => q{@},  
         project => q{+},  
     );  
   
     # XXX Should the completion (x) be case sensitive?      # XXX Should the completion (x) be case sensitive?
     my $priority_completion_regex = qr/      my $priority_completion_regex = qr{
         ^ \s*          ^ \s*
         (?i:   (x)        \s+)?          (?i:   (x)        \s+)?
         (?i:\( ([A-Z]) \) \s+)?          (?i:\( ([A-Z]) \) \s+)?
     /xms;      }xms;
   
     for my $tag ( keys %tags ) {      sub new {
         ## no critic strict          my ( $class, $options ) = @_;
         no strict 'refs';    # Violates use strict, but allows code generation  
         ## use critic  
   
         *{ $tag . 's' } = sub {          my $self = bless anon_scalar(), $class;
             my ($self) = @_;          my $ident = ident($self);
             return $self->_tags($tag);  
         };  
   
         *{ 'in_' . $tag } = sub {          if ( !ref $options ) {
             my ( $self, $item ) = @_;              $options = { text => $options };
             return $self->_is_in( $tag . 's', $item );          }
           elsif ( ref $options ne 'HASH' ) {
               croak 'Invalid parameter passed!';
           }
   
           $known_tags_of{$ident} = {
               context => q{@},
               project => q{+},
         };          };
     }  
   
     sub replace { _update_entry(@_) }          if ( exists $options->{tags} && ref $options->{tags} eq 'HASH' ) {
               foreach my $k ( keys %{ $options->{tags} } ) {
                   $known_tags_of{$ident}{$k} = $options->{tags}->{$k};
               }
           }
   
     sub new {          for my $tag ( keys %{ $known_tags_of{$ident} } ) {
         my ( $class, $text ) = @_;              ## no critic strict
               no strict
                   'refs';    # Violates use strict, but allows code generation
               ## use critic
   
         my $self = bless anon_scalar(), $class;              if ( !$self->can( $tag . 's' ) ) {
         my $ident = ident($self);                  *{ $tag . 's' } = sub {
                       my ($self) = @_;
                       return $self->_tags($tag);
                   };
               }
   
         $self->_update_entry($text);              if ( !$self->can( 'in_' . $tag ) ) {
                   *{ 'in_' . $tag } = sub {
                       my ( $self, $item ) = @_;
                       return $self->_is_in( $tag . 's', $item );
                   };
               }
           }
   
           $self->replace( $options->{text} );
   
         return $self;          return $self;
     }      }
   
     sub _update_entry {      sub replace {
         my ( $self, $text ) = @_;          my ( $self, $text ) = @_;
         my $ident = ident($self);          my $ident = ident($self);
   
Line 67 
Line 84 
   
         $text_of{$ident} = $text;          $text_of{$ident} = $text;
   
         foreach my $tag ( keys %tags ) {          foreach my $tag ( keys %{ $known_tags_of{$ident} } ) {
             my $symbol = quotemeta $tags{$tag};              my $symbol = quotemeta $known_tags_of{$ident}{$tag};
             $tags_of{$ident}{$tag} = { map { $_ => q{} }              $tags_of{$ident}{$tag} = { map { $_ => q{} }
                     $text =~ / (?:^|\s) $symbol  (\S+)/gxms };                      $text =~ / (?:^|\s) $symbol  (\S+)/gxms };
         }          }
Line 98 
Line 115 
         return $text_of{$ident};          return $text_of{$ident};
     }      }
   
     sub depri { pri( $_[0], '' ) }      sub depri { my ($self) = @_; return $self->pri(q{}) }
   
     sub pri {      sub pri {
         my ( $self, $new_pri ) = @_;          my ( $self, $new_pri ) = @_;
Line 140 
Line 157 
             push @new, $addition;              push @new, $addition;
         }          }
   
         return $self->_update_entry( join q{ }, @new, $new );          return $self->replace( join q{ }, @new, $new );
     }      }
   
     sub append {      sub append {
         my ( $self, $addition ) = @_;          my ( $self, $addition ) = @_;
         return $self->_update_entry( join q{ }, $self->text, $addition );          return $self->replace( join q{ }, $self->text, $addition );
     }      }
   
     sub do {      ## no critic 'homonym'
       sub do {    # This is what it is called in todo.sh
           ## use critic
         my ($self) = @_;          my ($self) = @_;
         my $ident = ident($self);          my $ident = ident($self);
   
Line 212 
Line 231 
   
 Creates an entry that can be manipulated.  Creates an entry that can be manipulated.
   
     my $entry = Text::Todo::Entry->new(['text of entry']);      my $entry = Text::Todo::Entry->new([
       'text of entry' | {
           [ text => 'text of entry' ,]
           [ tags => { additional_arg => 'identfier' }, ]
       } ]);
   
 If you don't pass any text, creates a blank entry.  If you don't pass any text, creates a blank entry.
   
   See tags below for a description of additional tags.
   
 =head2 text  =head2 text
   
 Returns the text of the entry.  Returns the text of the entry.
Line 249 
Line 274 
 Each tag type generates two accessor functions {tag}s and in_{tag}.  Each tag type generates two accessor functions {tag}s and in_{tag}.
   
 Current tags are context (@) and project (+).  Current tags are context (@) and project (+).
   
   When creating a new object you can pass in new tags to recognize.
   
       my $entry = Text::Todo::Entry->new({
           text => 'do something DUE:2011-01-01',
           tags => { due_date => 'DUE:' }
       });
   
       my @due_dates = $entry->due_dates;
   
   then @due_dates eq ( '2011-01-01' );
   
   and you could also:
   
       if ($entry->in_due_date('2011-01-01')) {
           # do something
       }
   
   
 =over  =over
   

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

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