Syntax higlighting improvements
Dennis Kaarsemaker [Sun, 29 Jul 2012 16:53:51 +0000 (18:53 +0200)]
- Support all languages Syntax::Highlight::Engine::Kate can detect
- Detect filetype based on #! lines in scripts
- Consider .t files to be perl code

lib/Gitalist/ContentMangler/Resolver/Default.pm
lib/Gitalist/Model/ContentMangler.pm
lib/Gitalist/View/SyntaxHighlight.pm
root/static/css/syntax/Code.css [moved from root/static/css/syntax/Perl.css with 100% similarity]

index 29aeda4..23d409d 100644 (file)
@@ -1,12 +1,51 @@
 use MooseX::Declare;
+use Syntax::Highlight::Engine::Kate ();
+
+our @interpreters = (
+    'awk',
+    'bash',
+    'ksh',
+    'make',
+    'node',
+    'perl',
+    'prolog',
+    'python',
+    'ruby',
+    'sh',
+    'tcl',
+);
+
+our %interpretersx = (
+    'awk'  => 'AWK',
+    'ksh'  => 'Bash',
+    'make' => 'Makefile',
+    'node' => 'Javascript',
+    'sh'   => 'Bash',
+);
 
 class Gitalist::ContentMangler::Resolver::Default with Gitalist::ContentMangler::Resolver {
     method resolve ($data) {
-        # This should be pulled out of $self->config
-        my $language;
-        $language = 'Perl' if $data->{filename} =~ /\.p[lm]$/i;
-        $language = 'Diff' if $data->{action} eq 'diff_fancy';
+        if($data->{action} eq 'diff_fancy') {
+            return 'Gitalist::ContentMangler::Transformer::SyntaxHighlight' => {language => 'Diff', css => 'Diff'};
+        }
+        my $kate = Syntax::Highlight::Engine::Kate->new();
+        # Detect .t files as perl code
+        $kate->extensions->{'*.t'} = ['Perl'];
+        my $language = $kate->languagePropose($data->{filename}) || $kate->languagePropose(lc $data->{filename});
+        if(!$language && exists($data->{blob})) {
+            my $interp = substr(${$data->{blob}}, 0, 256);
+            if($interp =~ /^#!(?:\S*\/)?([^\s\/]+)/) {
+                my $interp = $1;
+
+                for my $interpreter (@interpreters) {
+                    if($interp =~ /$interpreter/) {
+                        $language = $interpretersx{$interpreter} || ucfirst $interpreter;
+                        last;
+                    }
+                }
+            }
+        }
         return unless $language;
-        return 'Gitalist::ContentMangler::Transformer::SyntaxHighlight' => {language => $language, css => $language};
+        return 'Gitalist::ContentMangler::Transformer::SyntaxHighlight' => {language => $language, css => 'Code'};
     }
 }
index 6182362..720e0b3 100644 (file)
@@ -48,6 +48,7 @@ sub process {
 
   my($transformer, $config) = $self->resolve({
     filename => $c->stash->{filename} || '',
+    blob     => \$c->stash->{blob},
     config   => Gitalist->config->{'Model::ContentMangler'},
     action   => $c->action->name,
   });
index 4d98c36..de745ab 100644 (file)
@@ -5,7 +5,6 @@ use namespace::autoclean;
 extends 'Catalyst::View';
 
 use Syntax::Highlight::Engine::Kate ();
-use Syntax::Highlight::Engine::Kate::Perl ();
 
 use HTML::Entities qw(encode_entities);
 
@@ -19,7 +18,7 @@ sub render {
     my ($self, $c, $blob, $args) = @_;
 
     # Don't bother with anything over 64kb, it'll be tragically slow.
-    return encode_entities $blob if length $blob > 8192;
+    return encode_entities $blob if length $blob > 65536;
 
     my $lang = $args->{language};