version 1.6, 2010/04/30 07:18:33 |
version 1.13, 2010/05/01 22:11:58 |
|
|
#!/usr/bin/env perl |
#!/usr/bin/perl |
|
|
package Dudelicious; |
package Dudelicious; |
|
|
|
use 5.010; |
use Data::Dumper; |
use Data::Dumper; |
use version; our $VERSION = qv('0.1.0'); |
use version; our $VERSION = qv('0.1.0'); |
|
|
BEGIN { |
BEGIN { |
use FindBin; |
use FindBin; |
use lib "$FindBin::Bin/../lib"; |
use lib "$FindBin::Bin/../lib"; |
use lib "$FindBin::Bin/mojo/lib"; |
use lib "$FindBin::Bin/../mojo/lib"; |
} |
} |
|
|
use Carp qw/ carp croak /; |
use Carp qw/ carp croak /; |
|
|
default => { todo_dir => $ENV{DUDELICIOUS_HOME} || '.', }, |
default => { todo_dir => $ENV{DUDELICIOUS_HOME} || '.', }, |
}; |
}; |
|
|
|
app->renderer->add_helper( |
|
todo => sub { |
|
my ($self) = @_; |
|
state $todo = Text::Todo->new( $self->stash('config') ); |
|
|
|
my $file = $self->stash('file'); |
|
if ($file) { |
|
$file =~ s/(?:\.txt)?$/\.txt/ixms; |
|
$todo->load($file); |
|
} |
|
|
|
return $todo; |
|
} |
|
); |
|
|
|
app->renderer->add_helper( |
|
get_list => sub { |
|
my ($self) = @_; |
|
|
|
my $line = 1; |
|
return [ |
|
map { |
|
line => $line++, |
|
md5 => md5_hex( $_->text ), |
|
text => $_->text, |
|
done => $_->done, |
|
}, |
|
$self->helper('todo')->list |
|
]; |
|
} |
|
); |
|
|
get '/' => sub { |
get '/' => sub { |
my $self = shift; |
my $self = shift; |
|
|
my $dir = _todo($self)->file('todo_dir'); |
my $dir = $self->helper('todo')->file('todo_dir'); |
opendir my $dh, $dir or croak "Unable to opendir $dir: $!"; |
opendir my $dh, $dir or croak "Unable to opendir $dir: $!"; |
my @files = grep {/\.te?xt$/ixms} readdir $dh; |
my @files = grep {/\.te?xt$/ixms} readdir $dh; |
closedir $dh; |
closedir $dh; |
|
|
$self->render( files => \@files, layout => 'todotxt' ); |
$self->render( files => \@files, layout => 'todotxt' ); |
} => 'index'; |
} => 'index'; |
|
|
|
get '/todotxt' => 'todotxt'; |
|
|
get '/l/:file' => sub { |
get '/l/:file' => sub { |
my $self = shift; |
my $self = shift; |
my $file = $self->stash('file') . '.txt'; |
|
my $format = $self->stash('format') || 'html'; |
my $format = $self->stash('format') || 'html'; |
|
|
if ( $format eq 'json' ) { |
if ( $format eq 'json' ) { |
$self->render_json( _get_list( $self, $file ) ); |
$self->render_json( $self->helper('get_list') ); |
} |
} |
else { |
else { |
$self->render( |
$self->render( |
list => _get_list( $self, $file ), |
list => $self->helper('get_list'), |
layout => 'todotxt' |
layout => 'todotxt' |
); |
); |
} |
} |
} => 'list'; |
} => 'list'; |
|
|
get '/l/:file/e/:line' => sub { |
get '/l/:file/e/:line' => sub { |
my $self = shift; |
my $self = shift; |
my $file = $self->stash('file') . '.txt'; |
|
my $entry = $self->stash('line') - 1; |
|
my $format = $self->stash('format') || 'html'; |
my $format = $self->stash('format') || 'html'; |
|
my $entry = $self->helper('get_list')->[ $self->stash('line') - 1 ]; |
|
|
if ( $format eq 'json' ) { |
if ( $format eq 'json' ) { |
$self->render_json( _get_list( $self, $file )->[$entry] ); |
$self->render_json($entry); |
} |
} |
else { |
else { |
$self->render( |
$self->render( entry => $entry, layout => 'todotxt' ); |
entry => _get_list( $self, $file )->[$entry], |
|
layout => 'todotxt' |
|
); |
|
} |
} |
} => 'entry'; |
} => 'entry'; |
|
|
app->start unless caller(); |
get '/l/:file/t' => sub { |
|
my $self = shift; |
|
|
sub _todo { |
my $format = $self->stash('format') || 'html'; |
my ($c) = @_; |
|
|
|
if ( !$c->stash('todo') ) { |
if ( $format eq 'json' ) { |
my $todo = Text::Todo->new( $c->stash('config') ); |
$self->render_json( $self->helper('todo')->known_tags ); |
$c->stash( 'todo' => $todo ); |
|
} |
} |
|
else { |
|
$self->render( |
|
tags => $self->helper('todo')->known_tags, |
|
layout => 'todotxt' |
|
); |
|
} |
|
} => 'tags'; |
|
|
return $c->stash('todo'); |
get '/l/:file/t/:tag' => sub { |
} |
my $self = shift; |
|
|
sub _get_list { |
my $format = $self->stash('format') || 'html'; |
my ( $c, $file ) = @_; |
my $items = $self->helper('todo')->listtag( $self->stash('tag') ); |
|
|
my $line = 1; |
if ( $format eq 'json' ) { |
return [ |
$self->render_json($items); |
map ( { line => $line++, |
} |
md5 => md5_hex( $_->text ), |
else { |
text => $_->text, |
$self->render( items => $items, layout => 'todotxt' ); |
done => $_->done, |
} |
}, |
} => 'tag'; |
_todo($c)->listfile($file), |
|
) |
|
]; |
|
} |
|
|
|
|
app->start if !caller(); |
|
|
|
1; |
__DATA__ |
__DATA__ |
|
|
@@ list.txt.ep |
@@ list.txt.ep |
|
|
@@ entry.txt.ep |
@@ entry.txt.ep |
<%= $entry->{text} %> |
<%= $entry->{text} %> |
|
|
|
@@ tags.txt.ep |
|
% foreach my $tag (keys %{ $tags }) { |
|
<%= $tag %>, <%= $tags->{$tag} %> |
|
% } |
|
|
|
@@ tag.txt.ep |
|
# <%= $tag %> |
|
% foreach my $item (@{ $items}) { |
|
<%= $item %> |
|
% } |
|
|
@@ layouts/todotxt.txt.ep |
@@ layouts/todotxt.txt.ep |
%= content |
%= content |
|
|
|
|
@@ entry.html.ep |
@@ entry.html.ep |
<%= $entry->{text} %> |
<%= $entry->{text} %> |
|
|
|
@@ tags.html.ep |
|
% foreach my $tag (keys%{ $tags }) { |
|
<%= $tag %> == <%= $tags->{$tag} %><br /> |
|
% } |
|
|
|
@@ tag.html.ep |
|
<h2><%= $tag %></h2> |
|
% foreach my $item (@{ $items }) { |
|
<%= $item %><br /> |
|
% } |
|
|
@@ layouts/todotxt.html.ep |
@@ layouts/todotxt.html.ep |
<!doctype html><html> |
<!doctype html><html> |
<head><title>Funky!</title></head> |
<head> |
|
<title>Funky!</title> |
|
<link rel="stylesheet" href="<%= url_for 'todotxt', format => 'css' %>"> |
|
</head> |
<body><%== content %></body> |
<body><%== content %></body> |
</html> |
</html> |
|
|
|
@@ todotxt.css.ep |
|
body { |
|
background: LightGoldenRodYellow; |
|
color: DarkSlateBlue; |
|
} |
|
|
|
.inplaceeditor-saving { |
|
background: url(images/saving.gif) bottom right no-repeat; |
|
} |
|
|
|
|
__END__ |
__END__ |
|
|