Syntax higlighting improvements
[catagits/Gitalist.git] / lib / Gitalist / ContentMangler / Resolver / Default.pm
1 use MooseX::Declare;
2 use Syntax::Highlight::Engine::Kate ();
3
4 our @interpreters = (
5     'awk',
6     'bash',
7     'ksh',
8     'make',
9     'node',
10     'perl',
11     'prolog',
12     'python',
13     'ruby',
14     'sh',
15     'tcl',
16 );
17
18 our %interpretersx = (
19     'awk'  => 'AWK',
20     'ksh'  => 'Bash',
21     'make' => 'Makefile',
22     'node' => 'Javascript',
23     'sh'   => 'Bash',
24 );
25
26 class Gitalist::ContentMangler::Resolver::Default with Gitalist::ContentMangler::Resolver {
27     method resolve ($data) {
28         if($data->{action} eq 'diff_fancy') {
29             return 'Gitalist::ContentMangler::Transformer::SyntaxHighlight' => {language => 'Diff', css => 'Diff'};
30         }
31         my $kate = Syntax::Highlight::Engine::Kate->new();
32         # Detect .t files as perl code
33         $kate->extensions->{'*.t'} = ['Perl'];
34         my $language = $kate->languagePropose($data->{filename}) || $kate->languagePropose(lc $data->{filename});
35         if(!$language && exists($data->{blob})) {
36             my $interp = substr(${$data->{blob}}, 0, 256);
37             if($interp =~ /^#!(?:\S*\/)?([^\s\/]+)/) {
38                 my $interp = $1;
39
40                 for my $interpreter (@interpreters) {
41                     if($interp =~ /$interpreter/) {
42                         $language = $interpretersx{$interpreter} || ucfirst $interpreter;
43                         last;
44                     }
45                 }
46             }
47         }
48         return unless $language;
49         return 'Gitalist::ContentMangler::Transformer::SyntaxHighlight' => {language => $language, css => 'Code'};
50     }
51 }