From: Jakub Narebski <jnareb@gmail.com>
To: git@vger.kernel.org
Cc: Johannes Schindelin <johannes.schindelin@gmx.de>,
Jakub Narebski <jnareb@gmail.com>, Petr Baudis <pasky@suse.cz>
Subject: [PATCHv1 1/2] gitweb: Syntax highlighting support
Date: Tue, 27 Apr 2010 21:34:44 +0200 [thread overview]
Message-ID: <1272396885-30609-2-git-send-email-jnareb@gmail.com> (raw)
In-Reply-To: <1272396885-30609-1-git-send-email-jnareb@gmail.com>
From: Johannes Schindelin <johannes.schindelin@gmx.de>
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>
---
This patch is unchanged from previous version.
Compared to the version in Dscho repository, it makes gitweb do line
numbering by itself, instead of making 'highlight' do it... and then
rewriting it to conform to the rest of gitweb. It also leaves tab
expansion to gitweb, for 'blob' view to look the same with and without
syntax highlighting enabled.
The list of supported extensions is widened, and syntax is decided
based on basename, not on whole pathname (which might be a mistake).
Also the '.in' suffix is stripped if it is present (so 'git.spec.in'
file would use 'spec' syntax).
Note that gitweb.css contains default 'highlight' style, but perhaps
other style would be better fit for default gitweb CSS.
gitweb/gitweb.css | 18 ++++++++++++++
gitweb/gitweb.perl | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 82 insertions(+), 1 deletions(-)
diff --git a/gitweb/gitweb.css b/gitweb/gitweb.css
index 50067f2..4132aab 100644
--- a/gitweb/gitweb.css
+++ b/gitweb/gitweb.css
@@ -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; }
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index c356e95..de18ebf 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -227,6 +227,36 @@ our %avatar_size = (
# 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 @@ our %feature = (
'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
--
1.7.0.1
next prev parent reply other threads:[~2010-04-27 19:35 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-27 19:34 [PATCHv2 0/2] gitweb: Syntax highlighting support Jakub Narebski
2010-04-27 19:34 ` Jakub Narebski [this message]
2010-04-27 19:34 ` [PATCHv2 2/2] gitweb: Refactor syntax " Jakub Narebski
2010-04-27 20:32 ` [PATCHv2 0/2] gitweb: Syntax " Petr Baudis
2010-04-27 20:49 ` Jakub Narebski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1272396885-30609-2-git-send-email-jnareb@gmail.com \
--to=jnareb@gmail.com \
--cc=git@vger.kernel.org \
--cc=johannes.schindelin@gmx.de \
--cc=pasky@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).