Index: trunk/index.cgi
===================================================================
--- trunk/index.cgi	(revision 3)
+++ trunk/index.cgi	(revision 5)
@@ -1,161 +1,14 @@
 #!/usr/bin/perl -w
 use strict;
-
-use Encode;
-use URI;
-use CGI;
-use YAML;
-use DBI;
-use Template;
-use JSON;
-use Bookmarks;
-
-my $q = CGI->new;
-my $template = Template->new;
-
-my $method = $ENV{REQUEST_METHOD};
 
 # bookmarklet to add a bookmark via the browser
 # javascript:(function(){window.open("http://grim.ath.cx/~peter/bookmarks?uri="+document.location+"&title="+document.title,"edit_bookmark","width=800,height=250")})()
 
-my $dbname = 'new.db';
-my $dbh = DBI->connect("dbi:SQLite:dbname=$dbname", "", "", { RaiseError => 1 });
-
-my $bookmarks = Bookmarks->new({
-    dbh => $dbh,
-});
-
-=begin new style?
-
-if ($ENV{PATH_INFO} =~ m{^/(\d+)(?:/(uri|title|tags))?\b}) {
-    require Resource::Bookmark;
-    my $resource = Resource::Bookmark->new({
-        q => $q,
-        id => $1,
-        field => $2,
-        bookmarks => $bookmarks,
-    });
-    $resource->$method();
-}
-exit;
-
-=cut
-
-my %resource = (
-    GET => sub {
-        my ($q, $dbh) = @_;
-        if ($ENV{PATH_INFO} =~ m{^/(\d+)(?:/(uri|title|tags))?\b}) {
-            my $id = $1;
-            my $field = $2;
-            my $bookmark = $bookmarks->get_bookmark({ id => $id });
-            if ($bookmark) {
-                if ($field) {
-                    print $q->header(
-                        -type    => 'text/plain',
-                        -charset => 'UTF-8',
-                    );
-                    my $value = $bookmark->{$field};
-                    print ref $value eq 'ARRAY' ? join(',', @{ $value }) : $value;
-                } else {
-                    $bookmark->{exists} = 1;
-                    $bookmark->{created} = "Created " . localtime($bookmark->{ctime});
-                    $bookmark->{created} .= '; Updated ' . localtime($bookmark->{mtime}) unless $bookmark->{ctime} == $bookmark->{mtime};
-                    print $q->header(
-                        -type    => 'text/html',
-                        -charset => 'UTF-8',
-                    );
-                    $template->process(
-                        'bookmark.tt',
-                        $bookmark
-                    );
-                }
-            } else {
-                print $q->header(
-                    -type    => 'text/html',
-                    -charset => 'UTF-8',
-                    -status  => 404,
-                );
-                print "Not Found";
-            }
-        } elsif (defined(my $uri = $q->param('uri'))) {
-            my $bookmark = $bookmarks->get_bookmark({ uri => $uri });
-            if ($bookmark) {
-                #TODO: is there a better base URL to use?
-                print $q->redirect($q->url . '/' . $bookmark->{id});
-            } else {
-                # bookmark was not found; show the form to create a new bookmark
-                $bookmark->{uri} = $uri;
-                $bookmark->{title} = $q->param('title');
-                print $q->header(
-                    -type    => 'text/html',
-                    -charset => 'UTF-8',
-                    -status  => 404,
-                );
-                $template->process(
-                    'bookmark.tt',
-                    $bookmark
-                );
-            }
-        } else {
-            # list all the bookmarks 
-            my $format = $q->param('format') || 'html';
-            my $tag = $q->param('tag');
-            my @resources = $bookmarks->get_resources({ tag => $tag });
-            my @all_tags = $bookmarks->get_tags({ selected => $tag });
-            my @cotags = $bookmarks->get_cotags({ tag => $tag });
-
-            if ($format eq 'json') {
-                print $q->header(
-                    -type    => 'application/json',
-                    -charset => 'UTF-8',
-                );
-                print decode_utf8(
-                    encode_json({
-                        resources => \@resources,
-                    })
-                );
-            } else {
-                print $q->header(
-                    -type    => 'text/html',
-                    -charset => 'UTF-8',
-                );
-
-                # set the base URL, adding a trailing slash if needed
-                my $base_url = $q->url;
-                $base_url .= '/' if $base_url =~ m{/bookmarks$};
-
-                $template->process(
-                    'list.tt',
-                    {
-                        base_url     => $base_url,
-                        selected_tag => $tag,
-                        tags         => \@all_tags,
-                        cotags       => \@cotags,
-                        resources    => \@resources,
-                    },
-                );
-            }
-        }
-    },
-    POST => sub {
-        #TODO: deal with changing URIs
-        my ($q, $dbh) = @_;
-        my $uri = $q->param('uri');
-        my $title = $q->param('title');
-        my @tags = split ' ', $q->param('tags');
-        $bookmarks->add({
-            uri   => $uri,
-            title => $title,
-            tags  => \@tags,
-        });
-
-        my $location = URI->new($q->url);
-        $location->query_form(uri => $uri) if defined $q->url_param('uri');
-        $location->fragment('updated');
-        print $q->redirect($ENV{REQUEST_URI}); #$location);
-    },
+use CGI::Application::Dispatch;
+CGI::Application::Dispatch->dispatch(
+    table => [
+        '[get]'              => { app => 'BookmarkApp', rm => 'list' },
+        ':id/:field?[get]'   => { app => 'BookmarkApp', rm => 'view' },
+        ':id?[post]'         => { app => 'BookmarkApp', rm => 'edit' },
+    ],
 );
-
-$resource{$method}->($q, $dbh);
-
-
