Index: /trunk/BookmarkApp.pm
===================================================================
--- /trunk/BookmarkApp.pm	(revision 48)
+++ /trunk/BookmarkApp.pm	(revision 49)
@@ -7,5 +7,5 @@
 
 use Encode;
-use HTTP::Date qw{time2isoz};
+use HTTP::Date qw{time2isoz time2iso};
 use JSON;
 use Bookmarks;
@@ -79,4 +79,12 @@
         },
         {
+            text => 'CSV',
+            type => 'text/csv',
+            query => {
+                tag => $tags,
+                format => 'csv',
+            },
+        },
+        {
             text => 'URI List',
             type => 'text/uri-list',
@@ -85,5 +93,5 @@
                 format => 'text',
             },
-        }
+        },
     );
 
@@ -198,4 +206,30 @@
                 $_->uri
             } @resources;
+    } elsif ($format eq 'csv') {
+        require Text::CSV;
+        my $csv = Text::CSV->new;
+        my $text = qq{id,uri,title,tags,ctime,mtime\n};
+        for my $bookmark (@resources) {
+            my $success = $csv->combine(
+                $bookmark->id,
+                $bookmark->uri,
+                $bookmark->title,
+                join(' ', @{ $bookmark->tags }),
+                $bookmark->ctime,
+                $bookmark->mtime,
+            );
+            $text .= $csv->string . "\n" if $success;
+        }
+
+        # include the local timestamp in the attchment filename
+        my $dt = time2iso;
+        $dt =~ s/[^\d]//g;
+
+        $self->header_props(
+            -type       => 'text/csv',
+            -charset    => 'UTF-8',
+            -attachment => 'bookmarks-' . join('_', @tags) . "-$dt.csv",
+        );
+        return $text;
     } else {
         $self->header_props(
