From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jakub Narebski Subject: [PATCH/RFC 1/2 v2] gitweb: Syntax highlighting support Date: Sun, 28 Feb 2010 21:28:09 +0100 Message-ID: <1267388890-30305-1-git-send-email-jnareb@gmail.com> Cc: Johannes Schindelin , Jakub Narebski To: git@vger.kernel.org X-From: git-owner@vger.kernel.org Sun Feb 28 21:28:29 2010 Return-path: Envelope-to: gcvg-git-2@lo.gmane.org Received: from vger.kernel.org ([209.132.180.67]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1NlpkZ-00008l-So for gcvg-git-2@lo.gmane.org; Sun, 28 Feb 2010 21:28:28 +0100 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1032020Ab0B1U2U (ORCPT ); Sun, 28 Feb 2010 15:28:20 -0500 Received: from mail-fx0-f219.google.com ([209.85.220.219]:61872 "EHLO mail-fx0-f219.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031970Ab0B1U2U (ORCPT ); Sun, 28 Feb 2010 15:28:20 -0500 Received: by fxm19 with SMTP id 19so138667fxm.21 for ; Sun, 28 Feb 2010 12:28:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer; bh=tbO/4NVeiTEDCLyHfvY3qLfEwaU25U4LzEpppfEEYiA=; b=YPnZX9bqA5nQh6SyJMo12WmnB0LXDEOTKwJzZzPD5ShVanFLH8oQjYEA7YF15/Vba8 zru7FbqNzKd8BWRMsjm9HK3D4A5g+LJXfkuyaKunQsFaA4q/wJ3tt9CVa9gqMKpES3Tp xq3dG2Ie8bx583E0vhPMBtD3NCEfDe4aEoaiU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=jTwnMXU+9iO7TvmCtNNY8xBIKFty2SmSKQDQgjIOlIAzkrb4k00mscTW44VI6hs9BZ HxQyjtOY8y3YXlMdxyRKcljbaP+Vy1CVVJJHsJEKVODbG5x3pnnKOOgGP4m8jr8QEYlF y1jnPjpDc8qtOC1Jt21oeyAUdUFSPmmA7SfPI= Received: by 10.87.66.40 with SMTP id t40mr254731fgk.68.1267388896695; Sun, 28 Feb 2010 12:28:16 -0800 (PST) Received: from localhost.localdomain (abwn28.neoplus.adsl.tpnet.pl [83.8.237.28]) by mx.google.com with ESMTPS id l12sm2855592fgb.17.2010.02.28.12.28.15 (version=SSLv3 cipher=RC4-MD5); Sun, 28 Feb 2010 12:28:15 -0800 (PST) X-Mailer: git-send-email 1.6.6.1 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Archived-At: From: Johannes Schindelin 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 Signed-off-by: Jakub Narebski --- 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 hightlighting 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 deafule 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 32b04a4..5b85581 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 { @@ -5340,6 +5383,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); @@ -5347,6 +5391,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))) { @@ -5398,7 +5461,7 @@ sub git_blob { $line = untabify($line); printf "\n", - $nr, $nr, $nr, esc_html($line, -nbsp=>1); + $nr, $nr, $nr, $syntax ? $line : esc_html($line, -nbsp=>1); } } close $fd -- 1.6.6.1