mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
gitweb: Syntax highlighting support
It requires the 'highlight' program to do all the heavy-lifting. This is loosely based on Daniel Svensson's and Sham Chukoury's work in gitweb-xmms2.git (it cannot be cherry-picked, as gitweb-xmms2 first forked wildly, then not contributed back, and then went stale). [jn: cherry picked from bc1ed6aafd9ee4937559535c66c8bddf1864bec6 in http://repo.or.cz/w/git/dscho.git, with a few changes] Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Jakub Narebski <jnareb@gmail.com> Acked-by: Petr Baudis <pasky@suse.cz> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
ddb27a5a6b
commit
b331fe5476
|
@ -572,3 +572,21 @@ span.match {
|
|||
div.binary {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* Style definition generated by highlight 2.4.5, http://www.andre-simon.de/ */
|
||||
|
||||
/* Highlighting theme definition: */
|
||||
|
||||
.num { color:#2928ff; }
|
||||
.esc { color:#ff00ff; }
|
||||
.str { color:#ff0000; }
|
||||
.dstr { color:#818100; }
|
||||
.slc { color:#838183; font-style:italic; }
|
||||
.com { color:#838183; font-style:italic; }
|
||||
.dir { color:#008200; }
|
||||
.sym { color:#000000; }
|
||||
.line { color:#555555; }
|
||||
.kwa { color:#000000; font-weight:bold; }
|
||||
.kwb { color:#830000; }
|
||||
.kwc { color:#000000; font-weight:bold; }
|
||||
.kwd { color:#010181; }
|
||||
|
|
|
@ -227,6 +227,36 @@ BEGIN
|
|||
# Leave it undefined (or set to 'undef') to turn off load checking.
|
||||
our $maxload = 300;
|
||||
|
||||
# syntax highlighting
|
||||
our %highlight_type = (
|
||||
# match by basename
|
||||
'SConstruct' => 'py',
|
||||
'Program' => 'py',
|
||||
'Library' => 'py',
|
||||
'Makefile' => 'make',
|
||||
# match by extension
|
||||
'\.py$' => 'py', # Python
|
||||
'\.c$' => 'c',
|
||||
'\.h$' => 'c',
|
||||
'\.cpp$' => 'cpp',
|
||||
'\.cxx$' => 'cpp',
|
||||
'\.rb$' => 'ruby',
|
||||
'\.java$' => 'java',
|
||||
'\.css$' => 'css',
|
||||
'\.php3?$' => 'php',
|
||||
'\.sh$' => 'sh', # Bash / shell script
|
||||
'\.pl$' => 'pl', # Perl
|
||||
'\.js$' => 'js', # JavaScript
|
||||
'\.tex$' => 'tex', # TeX and LaTeX
|
||||
'\.bib$' => 'bib', # BibTeX
|
||||
'\.x?html$' => 'xml',
|
||||
'\.xml$' => 'xml',
|
||||
'\.awk$' => 'awk',
|
||||
'\.bat$' => 'bat', # DOS Batch script
|
||||
'\.ini$' => 'ini',
|
||||
'\.spec$' => 'spec', # RPM Spec
|
||||
);
|
||||
|
||||
# You define site-wide feature defaults here; override them with
|
||||
# $GITWEB_CONFIG as necessary.
|
||||
our %feature = (
|
||||
|
@ -445,6 +475,19 @@ BEGIN
|
|||
'javascript-actions' => {
|
||||
'override' => 0,
|
||||
'default' => [0]},
|
||||
|
||||
# Syntax highlighting support. This is based on Daniel Svensson's
|
||||
# and Sham Chukoury's work in gitweb-xmms2.git.
|
||||
# It requires the 'highlight' program, and therefore is disabled
|
||||
# by default.
|
||||
|
||||
# To enable system wide have in $GITWEB_CONFIG
|
||||
# $feature{'highlight'}{'default'} = [1];
|
||||
|
||||
'highlight' => {
|
||||
'sub' => sub { feature_bool('highlight', @_) },
|
||||
'override' => 0,
|
||||
'default' => [0]},
|
||||
);
|
||||
|
||||
sub gitweb_get_feature {
|
||||
|
@ -5346,6 +5389,7 @@ sub git_blob {
|
|||
open my $fd, "-|", git_cmd(), "cat-file", "blob", $hash
|
||||
or die_error(500, "Couldn't cat $file_name, $hash");
|
||||
my $mimetype = blob_mimetype($fd, $file_name);
|
||||
# use 'blob_plain' (aka 'raw') view for files that cannot be displayed
|
||||
if ($mimetype !~ m!^(?:text/|image/(?:gif|png|jpeg)$)! && -B $fd) {
|
||||
close $fd;
|
||||
return git_blob_plain($mimetype);
|
||||
|
@ -5353,6 +5397,25 @@ sub git_blob {
|
|||
# we can have blame only for text/* mimetype
|
||||
$have_blame &&= ($mimetype =~ m!^text/!);
|
||||
|
||||
my $have_highlight = gitweb_check_feature('highlight');
|
||||
my $syntax;
|
||||
if ($have_highlight && defined($file_name)) {
|
||||
my $basename = basename($file_name, '.in');
|
||||
foreach my $regexp (keys %highlight_type) {
|
||||
if ($basename =~ /$regexp/) {
|
||||
$syntax = $highlight_type{$regexp};
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
if ($syntax) {
|
||||
close $fd;
|
||||
open $fd, quote_command(git_cmd(), "cat-file", "blob", $hash)." | ".
|
||||
"highlight --xhtml --fragment -t 8 --syntax $syntax |"
|
||||
or die_error(500, "Couldn't open file or run syntax highlighter");
|
||||
}
|
||||
}
|
||||
|
||||
git_header_html(undef, $expires);
|
||||
my $formats_nav = '';
|
||||
if (defined $hash_base && (my %co = parse_commit($hash_base))) {
|
||||
|
@ -5404,7 +5467,7 @@ sub git_blob {
|
|||
$line = untabify($line);
|
||||
printf "<div class=\"pre\"><a id=\"l%i\" href=\"" . href(-replay => 1)
|
||||
. "#l%i\" class=\"linenr\">%4i</a> %s</div>\n",
|
||||
$nr, $nr, $nr, esc_html($line, -nbsp=>1);
|
||||
$nr, $nr, $nr, $syntax ? $line : esc_html($line, -nbsp=>1);
|
||||
}
|
||||
}
|
||||
close $fd
|
||||
|
|
Loading…
Reference in a new issue