source: bookmarks/trunk/index.cgi @ 3

Last change on this file since 3 was 3, checked in by peter, 12 years ago
  • Added a base URL to the list, guarenteed to end in "bookmarks/"
  • Default the ?format parameer to the list to "html" to avoid the unitialized value warnings
  • Added more classes to the individual bookmark page elements
  • Added an onclick handler to the tag links in a bookmark edit form that will attempt to open the link in the opener window; failing that, they will use a new window
  • Check for an opener before attempting to reload it on page load
  • Property svn:executable set to *
File size: 5.1 KB
Line 
1#!/usr/bin/perl -w
2use strict;
3
4use Encode;
5use URI;
6use CGI;
7use YAML;
8use DBI;
9use Template;
10use JSON;
11use Bookmarks;
12
13my $q = CGI->new;
14my $template = Template->new;
15
16my $method = $ENV{REQUEST_METHOD};
17
18# bookmarklet to add a bookmark via the browser
19# javascript:(function(){window.open("http://grim.ath.cx/~peter/bookmarks?uri="+document.location+"&title="+document.title,"edit_bookmark","width=800,height=250")})()
20
21my $dbname = 'new.db';
22my $dbh = DBI->connect("dbi:SQLite:dbname=$dbname", "", "", { RaiseError => 1 });
23
24my $bookmarks = Bookmarks->new({
25    dbh => $dbh,
26});
27
28=begin new style?
29
30if ($ENV{PATH_INFO} =~ m{^/(\d+)(?:/(uri|title|tags))?\b}) {
31    require Resource::Bookmark;
32    my $resource = Resource::Bookmark->new({
33        q => $q,
34        id => $1,
35        field => $2,
36        bookmarks => $bookmarks,
37    });
38    $resource->$method();
39}
40exit;
41
42=cut
43
44my %resource = (
45    GET => sub {
46        my ($q, $dbh) = @_;
47        if ($ENV{PATH_INFO} =~ m{^/(\d+)(?:/(uri|title|tags))?\b}) {
48            my $id = $1;
49            my $field = $2;
50            my $bookmark = $bookmarks->get_bookmark({ id => $id });
51            if ($bookmark) {
52                if ($field) {
53                    print $q->header(
54                        -type    => 'text/plain',
55                        -charset => 'UTF-8',
56                    );
57                    my $value = $bookmark->{$field};
58                    print ref $value eq 'ARRAY' ? join(',', @{ $value }) : $value;
59                } else {
60                    $bookmark->{exists} = 1;
61                    $bookmark->{created} = "Created " . localtime($bookmark->{ctime});
62                    $bookmark->{created} .= '; Updated ' . localtime($bookmark->{mtime}) unless $bookmark->{ctime} == $bookmark->{mtime};
63                    print $q->header(
64                        -type    => 'text/html',
65                        -charset => 'UTF-8',
66                    );
67                    $template->process(
68                        'bookmark.tt',
69                        $bookmark
70                    );
71                }
72            } else {
73                print $q->header(
74                    -type    => 'text/html',
75                    -charset => 'UTF-8',
76                    -status  => 404,
77                );
78                print "Not Found";
79            }
80        } elsif (defined(my $uri = $q->param('uri'))) {
81            my $bookmark = $bookmarks->get_bookmark({ uri => $uri });
82            if ($bookmark) {
83                #TODO: is there a better base URL to use?
84                print $q->redirect($q->url . '/' . $bookmark->{id});
85            } else {
86                # bookmark was not found; show the form to create a new bookmark
87                $bookmark->{uri} = $uri;
88                $bookmark->{title} = $q->param('title');
89                print $q->header(
90                    -type    => 'text/html',
91                    -charset => 'UTF-8',
92                    -status  => 404,
93                );
94                $template->process(
95                    'bookmark.tt',
96                    $bookmark
97                );
98            }
99        } else {
100            # list all the bookmarks
101            my $format = $q->param('format') || 'html';
102            my $tag = $q->param('tag');
103            my @resources = $bookmarks->get_resources({ tag => $tag });
104            my @all_tags = $bookmarks->get_tags({ selected => $tag });
105            my @cotags = $bookmarks->get_cotags({ tag => $tag });
106
107            if ($format eq 'json') {
108                print $q->header(
109                    -type    => 'application/json',
110                    -charset => 'UTF-8',
111                );
112                print decode_utf8(
113                    encode_json({
114                        resources => \@resources,
115                    })
116                );
117            } else {
118                print $q->header(
119                    -type    => 'text/html',
120                    -charset => 'UTF-8',
121                );
122
123                # set the base URL, adding a trailing slash if needed
124                my $base_url = $q->url;
125                $base_url .= '/' if $base_url =~ m{/bookmarks$};
126
127                $template->process(
128                    'list.tt',
129                    {
130                        base_url     => $base_url,
131                        selected_tag => $tag,
132                        tags         => \@all_tags,
133                        cotags       => \@cotags,
134                        resources    => \@resources,
135                    },
136                );
137            }
138        }
139    },
140    POST => sub {
141        #TODO: deal with changing URIs
142        my ($q, $dbh) = @_;
143        my $uri = $q->param('uri');
144        my $title = $q->param('title');
145        my @tags = split ' ', $q->param('tags');
146        $bookmarks->add({
147            uri   => $uri,
148            title => $title,
149            tags  => \@tags,
150        });
151
152        my $location = URI->new($q->url);
153        $location->query_form(uri => $uri) if defined $q->url_param('uri');
154        $location->fragment('updated');
155        print $q->redirect($ENV{REQUEST_URI}); #$location);
156    },
157);
158
159$resource{$method}->($q, $dbh);
160
161
Note: See TracBrowser for help on using the repository browser.