git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC/PATCH] gitweb: Syntax highlighting support
@ 2010-02-17 21:43 Jakub Narebski
  2010-02-18 10:04 ` Johannes Schindelin
  2010-02-18 22:01 ` Jakub Narebski
  0 siblings, 2 replies; 4+ messages in thread
From: Jakub Narebski @ 2010-02-17 21:43 UTC (permalink / raw)
  To: git; +Cc: Johannes Schindelin

From: Johannes Schindelin <johannes.schindelin@gmx.de>

It requires the 'highlight' program to do all the heavy-lifting:
http://www.andre-simon.de / http://wiki.andre-simon.de

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 is a RFC, because there exist other syntax highlighters that can
function as filter (take input from STDIN, and write result to STDOUT),
and have (X)HTML among supported output formats.  Beside 'highlight'
by Andre Simon, there is also 'source-highlight' (GNU Source Highlight),
and probably other programs.  

It would be nice to be able to configure which program to use.  The
question is if it should be configurable in per-repository basis, or
there should be global (per gitweb configuration) highlighter, while
highlighting can be turned on and off in per-repository basis.

The list of supported extensions is widened, but I see that I fotgot
to include syntax highlighting for Perl.

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.  We should probably
leave tab expansion to gitweb, so that 'blob' view would look the same
with and without syntax hightlighting enabled.

Note that gitweb.css contains default 'highlight' style, but perhaps
other style would be better fit for deafule gitweb CSS.

WARNING: No tests!

Have fun playing with it!

 gitweb/gitweb.css  |   18 ++++++++++++++++
 gitweb/gitweb.perl |   57 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 73 insertions(+), 2 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..3b6df9f 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -227,6 +227,26 @@ our %avatar_size = (
 # Leave it undefined (or set to 'undef') to turn off load checking.
 our $maxload = 300;
 
+# syntax highlighting
+our %highlight = (
+	# match by basename
+	'SConstruct' => 'py',
+	'Program' => 'py',
+	'Library' => 'py',
+	'Makefile' => 'make',
+	# match by extension
+	'\.py$' => 'py',
+	'\.c$' => 'c',
+	'\.h$' => 'c',
+	'\.cpp$' => 'cpp',
+	'\.cxx$' => 'cpp',
+	'\.rb$' => 'ruby',
+	'\.java$' => 'java',
+	'\.css$' => 'css',
+	'\.php3?$' => 'php',
+	'\.sh$' => 'sh',
+);
+
 # You define site-wide feature defaults here; override them with
 # $GITWEB_CONFIG as necessary.
 our %feature = (
@@ -445,6 +465,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 +5373,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 +5381,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);
+		foreach my $regexp (keys %highlight) {
+			if ($basename =~ /$regexp/) {
+				$syntax = $highlight{$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))) {
@@ -5395,10 +5448,10 @@ sub git_blob {
 		while (my $line = <$fd>) {
 			chomp $line;
 			$nr++;
-			$line = untabify($line);
+			$line = untabify($line) unless ($syntax);
 			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

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [RFC/PATCH] gitweb: Syntax highlighting support
  2010-02-17 21:43 [RFC/PATCH] gitweb: Syntax highlighting support Jakub Narebski
@ 2010-02-18 10:04 ` Johannes Schindelin
  2010-02-18 19:00   ` Jakub Narebski
  2010-02-18 22:01 ` Jakub Narebski
  1 sibling, 1 reply; 4+ messages in thread
From: Johannes Schindelin @ 2010-02-18 10:04 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git

Hi,

On Wed, 17 Feb 2010, Jakub Narebski wrote:

> [jn: cherry picked from bc1ed6aafd9ee4937559535c66c8bddf1864bec6
>  in http://repo.or.cz/w/git/dscho.git, with a few changes]

Thanks. These changes are greatly appreciated, and I will try to find the 
time to install this in our production system tomorrow.

Ciao,
Dscho

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RFC/PATCH] gitweb: Syntax highlighting support
  2010-02-18 10:04 ` Johannes Schindelin
@ 2010-02-18 19:00   ` Jakub Narebski
  0 siblings, 0 replies; 4+ messages in thread
From: Jakub Narebski @ 2010-02-18 19:00 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: git

On Thu, 18 Feb 2010, Johannes Schindelin wrote:
> On Wed, 17 Feb 2010, Jakub Narebski wrote:
> 
> > [jn: cherry picked from bc1ed6aafd9ee4937559535c66c8bddf1864bec6
> >  in http://repo.or.cz/w/git/dscho.git, with a few changes]
> 
> Thanks. These changes are greatly appreciated, and I will try to find the 
> time to install this in our production system tomorrow.

This patch is also available in 'gitweb/web' branch in my repository:
http://repo.or.cz/w/git/jnareb-git.git

P.S. I have applied your patch "cherry-picking" it from your repository
by saving 'patch' view from gitweb and using git-am on it.  You can pull
  git://repo.or.cz/git/jnareb-git.git gitweb/web
or you can do the same
  http://repo.or.cz/w/git/jnareb-git.git/patch/7bf179bb5c40518b98bc63ebcfa3ae7f0b437a42
-- 
Jakub Narebski
Poland

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RFC/PATCH] gitweb: Syntax highlighting support
  2010-02-17 21:43 [RFC/PATCH] gitweb: Syntax highlighting support Jakub Narebski
  2010-02-18 10:04 ` Johannes Schindelin
@ 2010-02-18 22:01 ` Jakub Narebski
  1 sibling, 0 replies; 4+ messages in thread
From: Jakub Narebski @ 2010-02-18 22:01 UTC (permalink / raw)
  To: git; +Cc: Johannes Schindelin

Jakub Narebski <jnareb@gmail.com> writes:

> From: Johannes Schindelin <johannes.schindelin@gmx.de>
> 
> It requires the 'highlight' program to do all the heavy-lifting:
> http://www.andre-simon.de / http://wiki.andre-simon.de

[...]
> ---
> This is a RFC, because there exist other syntax highlighters that can
> function as filter (take input from STDIN, and write result to STDOUT),
> and have (X)HTML among supported output formats.  Beside 'highlight'
> by Andre Simon, there is also 'source-highlight' (GNU Source Highlight),
> and probably other programs.  

Actually GNU Source Highlight (http://www.gnu.org/software/src-highlite)
as it is now wouldn't be a good fit for gitweb, because it lacks 
equivalent of Highlight '--fragment' option; even with '--no-doc' it
prefixes contents with some comments and wraps the whole with <pre><tt>
tags.

On the other hand side one can also use Perl modules from CPAN for
syntax highlighting.  It would be nice to have this option for syntax
highlighting in gitweb.

-- 
Jakub Narebski
Poland
ShadeHawk on #git

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-02-18 22:09 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-02-17 21:43 [RFC/PATCH] gitweb: Syntax highlighting support Jakub Narebski
2010-02-18 10:04 ` Johannes Schindelin
2010-02-18 19:00   ` Jakub Narebski
2010-02-18 22:01 ` Jakub Narebski

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).