| version 1.12, 2010/01/10 00:13:14 |
version 1.13, 2010/01/10 01:03:02 |
|
|
| 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.12 2010/01/10 00:13:14 andrew Exp $ |
| |
|
| use warnings; |
use warnings; |
| use strict; |
use strict; |
|
|
| 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:\( ([A-Z]) \) \s+)? |
(?i:\( ([A-Z]) \) \s+)? |
| /xms; |
/xms; |
| |
|
| for my $tag ( keys %tags ) { |
|
| ## no critic strict |
|
| no strict 'refs'; # Violates use strict, but allows code generation |
|
| ## use critic |
|
| |
|
| *{ $tag . 's' } = sub { |
|
| my ($self) = @_; |
|
| return $self->_tags($tag); |
|
| }; |
|
| |
|
| *{ 'in_' . $tag } = sub { |
|
| my ( $self, $item ) = @_; |
|
| return $self->_is_in( $tag . 's', $item ); |
|
| }; |
|
| } |
|
| |
|
| sub replace { _update_entry(@_) } |
sub replace { _update_entry(@_) } |
| |
|
| sub new { |
sub new { |
| my ( $class, $text ) = @_; |
my ( $class, $options ) = @_; |
| |
|
| my $self = bless anon_scalar(), $class; |
my $self = bless anon_scalar(), $class; |
| my $ident = ident($self); |
my $ident = ident($self); |
| |
|
| $self->_update_entry($text); |
if ( !ref $options ) { |
| |
$options = { text => $options }; |
| |
} |
| |
elsif ( ref $options ne 'HASH' ) { |
| |
croak 'Invalid parameter passed!'; |
| |
} |
| |
|
| |
$known_tags_of{$ident} = { |
| |
context => q{@}, |
| |
project => q{+}, |
| |
}; |
| |
|
| |
if ( exists $options->{tags} && ref $options->{tags} eq 'HASH' ) { |
| |
foreach my $k ( keys %{ $options->{tags} } ) { |
| |
$known_tags_of{$ident}{$k} = $options->{tags}->{$k}; |
| |
} |
| |
} |
| |
|
| |
for my $tag ( keys %{ $known_tags_of{$ident} } ) { |
| |
## no critic strict |
| |
no strict |
| |
'refs'; # Violates use strict, but allows code generation |
| |
## use critic |
| |
|
| |
if ( !$self->can( $tag . 's' ) ) { |
| |
*{ $tag . 's' } = sub { |
| |
my ($self) = @_; |
| |
return $self->_tags($tag); |
| |
}; |
| |
} |
| |
|
| |
if ( !$self->can( 'in_' . $tag ) ) { |
| |
*{ 'in_' . $tag } = sub { |
| |
my ( $self, $item ) = @_; |
| |
return $self->_is_in( $tag . 's', $item ); |
| |
}; |
| |
} |
| |
} |
| |
|
| |
$self->_update_entry( $options->{text} ); |
| |
|
| return $self; |
return $self; |
| } |
} |
| |
|
|
|
| |
|
| $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 }; |
| } |
} |
|
|
| |
|
| 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. |
|
|
| 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 |
| |
|