Implemented necessary functionality so binary files no longer render literally.
Dan Brook [Sat, 10 Apr 2010 10:13:35 +0000 (11:13 +0100)]
* Added deps for File::Type and File::Type::WebImages.
* Haven't been able to test binary non-image files as the presence of one (I
tried a .zip) breaks Git::PurePerl on win32 at least.

Makefile.PL
lib/Gitalist/Controller/Fragment/Ref.pm
lib/Gitalist/Controller/Ref.pm
root/fragment/ref/blob.tt2
root/ref/blob.tt2
root/static/css/core.css

index d733e1c..6abc413 100644 (file)
@@ -83,6 +83,8 @@ requires 'CGI';
 requires 'DateTime';
 requires 'DateTime::Format::Mail';
 requires 'File::Copy::Recursive';
+requires 'File::Type';
+requires 'File::Type::WebImages';
 requires 'File::Which';
 requires 'HTML::Entities';
 requires 'IPC::Run';
index e537896..2917616 100644 (file)
@@ -8,6 +8,8 @@ with qw/
     Gitalist::URIStructure::Fragment::WithLog
 /;
 
+use File::Type::WebImages ();
+
 sub base : Chained('/fragment/repository/find') PathPart('') CaptureArgs(0) {}
 
 sub _diff {
@@ -82,7 +84,9 @@ after blob => sub {
     my ( $self, $c ) = @_;
     $c->stash(
         # XXX Hack hack hack, see View::SyntaxHighlight
-        language => ($c->stash->{filename} =~ /\.p[lm]$/i ? 'Perl' : ''),
+        language  => ($c->stash->{filename} =~ /\.p[lm]$/i ? 'Perl' : ''),
+        is_image  => File::Type::WebImages::mime_type($c->stash->{blob}),
+        is_binary => -B $c->stash->{blob},
     );
 
     $c->forward('View::SyntaxHighlight')
index e43bd98..c0e4ce3 100644 (file)
@@ -6,6 +6,9 @@ use namespace::autoclean;
 BEGIN { extends 'Gitalist::Controller' }
 with 'Gitalist::URIStructure::Ref';
 
+use File::Type;
+use File::Type::WebImages ();
+
 sub base : Chained('/repository/find') PathPart('') CaptureArgs(0) {}
 
 after commit => sub {
@@ -20,7 +23,16 @@ sub raw : Chained('find') Does('FilenameArgs') Args() {
     my ($self, $c) = @_;
     $c->forward('find_blob');
 
-    $c->response->content_type('text/plain; charset=utf-8');
+    if(-T $c->stash->{blob}) {
+       $c->response->content_type('text/plain; charset=utf-8');
+    } else {
+       my $ft = File::Type->new();
+       $c->response->content_type(
+           File::Type::WebImages::mime_type($c->stash->{blob})
+        || File::Type->new->mime_type($c->stash->{blob})
+       );
+    }
+
     $c->response->body(delete $c->stash->{blob});
 }
 
index 592f8c5..aaaa65d 100644 (file)
@@ -1 +1,7 @@
-[% blob %]
+[%- IF is_image -%]
+<div class='blob'><img src="[% c.uri_for_action('/ref/raw', c.req.captures, filename) %]" title="[% filename %]"></div>
+[%- ELSIF is_binary -%]
+<div class='blob'>This is a binary file which won't render natively on the web, but you can get it here all the same: <a href="[% c.uri_for_action('/ref/raw', c.req.captures, filename) %]" title="[% filename %]">[% filename %]</a></div>
+[%- ELSE -%]
+<pre class='blob'>[% blob | html %]</pre>
+[%- END -%]
index ad81803..fb4497d 100755 (executable)
@@ -7,8 +7,8 @@
     [% short_cmt(head.comment) %]
    </div>
   [% END %]
-       <pre class='blob'>[% subinclude('/fragment/ref/blob', c.req.captures, c.req.args.to_path) | html %]</pre>
+
+[% subinclude('/fragment/ref/blob', c.req.captures, c.req.args.to_path) %]
 
 
  
\ No newline at end of file
index 001b995..d4220de 100755 (executable)
@@ -467,6 +467,10 @@ pre.blob {
   overflow:auto;
   font-size:12px;
 }
+div.blob {
+    text-align: center;
+    margin: 30px;
+}
 
 /* /blobdiff etc */