Add CSV output (Content-Disposition: attachment) to FlatFielder mod_perl
authorMike Rylander <mrylander@gmail.com>
Thu, 29 Mar 2012 12:55:36 +0000 (08:55 -0400)
committerMike Rylander <mrylander@gmail.com>
Thu, 29 Mar 2012 12:55:36 +0000 (08:55 -0400)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/perlmods/lib/OpenILS/WWW/FlatFielder.pm

index 19c40b4..549b46b 100644 (file)
@@ -37,6 +37,15 @@ sub html_ish_output {
 }
 
 my $_output_handler_dispatch = {
+    "text/csv" => {
+        "prio" => 0,
+        "code" => sub {
+            my ($r, $args) = @_;
+            $r->headers_out->set("Content-Disposition" => "attachment; filename=FlatSearch.csv");
+            $r->content_type('text/csv; name=FlatSearch.csv; charset=utf-8');
+            return data_to_csv( $args );
+        }
+    },
     "text/html" => {
         "prio" => 0,
         "code" => sub {
@@ -123,6 +132,27 @@ sub data_to_xml {
     return $dom->toString();
 }
 
+sub data_to_csv {
+    my ($args) = @_;
+
+    my @keys = sort { $a cmp $b } keys %{ $$args{data}[0] };
+    return if (!@keys);
+
+    my $output = quote_for_csv(@keys);
+
+    for my $i (@{$$args{data}}) {
+        $output = quote_for_csv(
+            map { $$args{data}[$i]{$_} } @keys
+        );
+    }
+
+    return $output;
+}
+
+sub quote_for_csv {
+    return '"' . join('","', map { s/"/""/g } @_ ) . "\"\015\012";
+}
+
 sub data_to_json {
     my ($args) = @_;