Annotation of todotxt/Text-Todo/bin/dudelicious.pl, Revision 1.8
1.8 ! andrew 1: #!/usr/bin/perl
1.1 andrew 2:
1.2 andrew 3: package Dudelicious;
4:
1.6 andrew 5: use Data::Dumper;
1.4 andrew 6: use version; our $VERSION = qv('0.1.0');
7:
1.6 andrew 8: BEGIN {
9: use FindBin;
10: use lib "$FindBin::Bin/../lib";
1.8 ! andrew 11: use lib "$FindBin::Bin/../mojo/lib";
1.6 andrew 12: }
1.2 andrew 13:
1.5 andrew 14: use Carp qw/ carp croak /;
1.6 andrew 15: use Digest::MD5 qw/ md5_hex /;
16: use Text::Todo;
1.5 andrew 17:
1.1 andrew 18: use Mojolicious::Lite;
1.6 andrew 19: use Mojo::JSON;
1.5 andrew 20:
21: app->home->parse( $ENV{DUDELICIOUS_HOME} ) if $ENV{DUDELICIOUS_HOME};
1.1 andrew 22:
1.6 andrew 23: plugin 'json_config' => {
24: file => 'dudelicious.conf',
25: default => { todo_dir => $ENV{DUDELICIOUS_HOME} || '.', },
26: };
1.1 andrew 27:
1.5 andrew 28: get '/' => sub {
1.1 andrew 29: my $self = shift;
1.5 andrew 30:
1.6 andrew 31: my $dir = _todo($self)->file('todo_dir');
1.5 andrew 32: opendir my $dh, $dir or croak "Unable to opendir $dir: $!";
33: my @files = grep {/\.te?xt$/ixms} readdir $dh;
34: closedir $dh;
35:
36: $self->render( files => \@files, layout => 'todotxt' );
37: } => 'index';
38:
39: get '/l/:file' => sub {
1.6 andrew 40: my $self = shift;
41: my $file = $self->stash('file') . '.txt';
42: my $format = $self->stash('format') || 'html';
1.7 andrew 43: my $list = _get_list( $self, $file );
1.5 andrew 44:
1.6 andrew 45: if ( $format eq 'json' ) {
1.7 andrew 46: $self->render_json($list);
1.6 andrew 47: }
48: else {
1.7 andrew 49: $self->render( list => $list, layout => 'todotxt' );
1.6 andrew 50: }
1.5 andrew 51: } => 'list';
52:
1.6 andrew 53: get '/l/:file/e/:line' => sub {
54: my $self = shift;
55: my $file = $self->stash('file') . '.txt';
56: my $format = $self->stash('format') || 'html';
1.7 andrew 57: my $entry = _get_list( $self, $file )->[ $self->stash('line') - 1 ];
1.6 andrew 58:
59: if ( $format eq 'json' ) {
1.7 andrew 60: $self->render_json($entry);
1.6 andrew 61: }
62: else {
1.7 andrew 63: $self->render( entry => $entry, layout => 'todotxt' );
1.6 andrew 64: }
1.5 andrew 65: } => 'entry';
1.1 andrew 66:
1.3 andrew 67: app->start unless caller();
1.5 andrew 68:
1.6 andrew 69: sub _todo {
70: my ($c) = @_;
1.5 andrew 71:
1.6 andrew 72: if ( !$c->stash('todo') ) {
73: my $todo = Text::Todo->new( $c->stash('config') );
74: $c->stash( 'todo' => $todo );
75: }
1.5 andrew 76:
1.6 andrew 77: return $c->stash('todo');
78: }
1.5 andrew 79:
1.6 andrew 80: sub _get_list {
81: my ( $c, $file ) = @_;
1.5 andrew 82:
1.6 andrew 83: my $line = 1;
84: return [
85: map ( { line => $line++,
86: md5 => md5_hex( $_->text ),
87: text => $_->text,
88: done => $_->done,
89: },
90: _todo($c)->listfile($file),
91: )
92: ];
1.5 andrew 93: }
94:
1.1 andrew 95: __DATA__
96:
1.5 andrew 97: @@ list.txt.ep
1.6 andrew 98: % foreach my $entry (@{ $list }) {
99: %== include 'entry', entry => $entry;
1.5 andrew 100: % }
101:
102: @@ entry.txt.ep
1.6 andrew 103: <%= $entry->{text} %>
1.5 andrew 104:
105: @@ layouts/todotxt.txt.ep
106: %= content
107:
1.1 andrew 108: @@ index.html.ep
1.5 andrew 109: % foreach my $file (@{ $files }) {
110: <%== $file %> <br />
111: % }
112:
113: @@ list.html.ep
114: <h1><%= $file %></h1>
115: <ol>
1.6 andrew 116: % foreach my $entry (@{ $list }) {
1.5 andrew 117: <li>
1.6 andrew 118: %= include 'entry', entry => $entry;
1.5 andrew 119: </li>
120: % }
121: </ol>
1.1 andrew 122:
1.5 andrew 123: @@ entry.html.ep
1.6 andrew 124: <%= $entry->{text} %>
1.5 andrew 125:
126: @@ layouts/todotxt.html.ep
1.1 andrew 127: <!doctype html><html>
128: <head><title>Funky!</title></head>
129: <body><%== content %></body>
130: </html>
1.4 andrew 131:
132: __END__
133:
134: =head1 NAME
135:
136: dudelicious - A Mojolicous interface to your todotxt files
137:
138: =head1 VERSION
139:
140: Since the $VERSION can't be automatically included,
141: here is the RCS Id instead, you'll have to look up $VERSION.
142:
1.8 ! andrew 143: $Id: dudelicious.pl,v 1.7 2010/04/30 06:23:32 andrew Exp $
1.4 andrew 144:
145: =head1 SYNOPSIS
146:
147: dudelicious daemon
148:
149: Then browse to http://localhost:3000/
150:
151: =head1 DESCRIPTION
152:
153: A Mojolicous web app for access to your todotxt files
154:
155: The modules are there to give more access to my todo.txt file from more
156: places. My goal is a web API for a web interface and then a WebOS version for
157: my Palm Pre.
158:
159: For more information see L<http://todotxt.com>
160:
161: =head1 USAGE
162:
163: See todo.pl -h
164:
165: =head1 OPTIONS
166:
167: See todo.pl -h
168:
169: =head1 REQUIRED ARGUMENTS
170:
171: See todo.pl -h
172:
173: =head1 CONFIGURATION AND ENVIRONMENT
174:
175: =head1 DIAGNOSTICS
176:
177: =head1 DEPENDENCIES
178:
179: Perl Modules:
180:
181: =over
182:
183: =item Text::Todo
184:
185: =item Mojolicous::Lite
186:
187: =item version
188:
189: =back
190:
191:
192: =head1 BUGS AND LIMITATIONS
193:
194: No bugs have been reported.
195:
196: =head1 AUTHOR
197:
198: Andrew Fresh C<< <andrew@cpan.org> >>
199:
200:
201: =head1 LICENSE AND COPYRIGHT
202:
203: Copyright (c) 2010, Andrew Fresh C<< <andrew@cpan.org> >>. All rights reserved.
204:
205: This module is free software; you can redistribute it and/or
206: modify it under the same terms as Perl itself. See L<perlartistic>.
207:
208:
209: =head1 DISCLAIMER OF WARRANTY
210:
211: BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
212: FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
213: OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
214: PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
215: EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
216: WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
217: ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
218: YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
219: NECESSARY SERVICING, REPAIR, OR CORRECTION.
220:
221: IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
222: WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
223: REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
224: LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
225: OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
226: THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
227: RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
228: FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
229: SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
230: SUCH DAMAGES.
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>