From: Dennis Kaarsemaker Date: Sun, 29 Jul 2012 16:53:51 +0000 (+0200) Subject: Syntax higlighting improvements X-Git-Tag: 0.004002~3^2~1 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FGitalist.git;a=commitdiff_plain;h=a8f570133294adb58620440e75c2cca0d32e0934 Syntax higlighting improvements - Support all languages Syntax::Highlight::Engine::Kate can detect - Detect filetype based on #! lines in scripts - Consider .t files to be perl code --- diff --git a/lib/Gitalist/ContentMangler/Resolver/Default.pm b/lib/Gitalist/ContentMangler/Resolver/Default.pm index 29aeda4..23d409d 100644 --- a/lib/Gitalist/ContentMangler/Resolver/Default.pm +++ b/lib/Gitalist/ContentMangler/Resolver/Default.pm @@ -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'}; } } diff --git a/lib/Gitalist/Model/ContentMangler.pm b/lib/Gitalist/Model/ContentMangler.pm index 6182362..720e0b3 100644 --- a/lib/Gitalist/Model/ContentMangler.pm +++ b/lib/Gitalist/Model/ContentMangler.pm @@ -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, }); diff --git a/lib/Gitalist/View/SyntaxHighlight.pm b/lib/Gitalist/View/SyntaxHighlight.pm index 4d98c36..de745ab 100644 --- a/lib/Gitalist/View/SyntaxHighlight.pm +++ b/lib/Gitalist/View/SyntaxHighlight.pm @@ -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}; diff --git a/root/static/css/syntax/Perl.css b/root/static/css/syntax/Code.css similarity index 100% rename from root/static/css/syntax/Perl.css rename to root/static/css/syntax/Code.css