cgit

commit 46b7abed99e957008c01c02cf612aa526ba92f04

Author: Lars Hjemli <hjemli@gmail.com>

ui-tree: add support for source-filter option

This new option is used to specify an external command which will be
executed when displaying blob content in the tree view. Blob content
will be written to STDIN of the filter and STDOUT from the filter
will be included verbatim in the html output from cgit. The file name
of the blob will be passed as the only argument to the filter command.

Signed-off-by: Lars Hjemli <hjemli@gmail.com>

 cgit.c | 2 ++
 cgit.h | 1 +
 cgitrc.5.txt | 8 ++++++++
 ui-tree.c | 18 ++++++++++++++----


diff --git a/cgit.c b/cgit.c
index 779a4643abb87e84aef93dc40239c26a4a17d63b..eb7b45d5e77f897276a3765b09124723e245439b 100644
--- a/cgit.c
+++ b/cgit.c
@@ -100,6 +100,8 @@ 	else if (!strcmp(name, "max-repo-count"))
 		ctx.cfg.max_repo_count = atoi(value);
 	else if (!strcmp(name, "max-commit-count"))
 		ctx.cfg.max_commit_count = atoi(value);
+	else if (!strcmp(name, "source-filter"))
+		ctx.cfg.source_filter = new_filter(value, 1);
 	else if (!strcmp(name, "summary-log"))
 		ctx.cfg.summary_log = atoi(value);
 	else if (!strcmp(name, "summary-branches"))




diff --git a/cgit.h b/cgit.h
index d0fff1f7f8cd5a0af073afce2d8ea23301811154..f9cf0df76df342b53f7c2bd724dccf0f16265a3d 100644
--- a/cgit.h
+++ b/cgit.h
@@ -183,6 +183,7 @@ 	int snapshots;
 	int summary_branches;
 	int summary_log;
 	int summary_tags;
+	struct cgit_filter *source_filter;
 };
 
 struct cgit_page {




diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index a207fe07aadb9eb2863b1c47165e804772a12e5b..d420ad4e474b4710982170794afa170566272aab 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -198,6 +198,14 @@ 		"tar.bz2"	bzip-compressed tar-file
 		"zip"		zip-file
 	Default value: none.
 
+source-filter::
+	Specifies a command which will be invoked to format plaintext blobs
+	in the tree view. The command will get the blob content on its STDIN
+	and the name of the blob as its only command line argument. The STDOUT
+	from the command will be included verbatim as the blob contents, i.e.
+	this can be used to implement e.g. syntax highlighting. Default value:
+	none.
+
 summary-branches::
 	Specifies the number of branches to display in the repository "summary"
 	view. Default value: "10".




diff --git a/ui-tree.c b/ui-tree.c
index 553dbaa5a27e60ebad594d23cc842895bdf4beed..816e1213336fe18f010e47570bebd80207fb20b1 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -15,13 +15,23 @@ char *curr_rev;
 char *match_path;
 int header = 0;
 
-static void print_text_buffer(char *buf, unsigned long size)
+static void print_text_buffer(const char *name, char *buf, unsigned long size)
 {
 	unsigned long lineno, idx;
 	const char *numberfmt =
 		"<a class='no' id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a>\n";
 
 	html("<table summary='blob content' class='blob'>\n");
+	if (ctx.cfg.source_filter) {
+		html("<tr><td class='lines'><pre><code>");
+		ctx.cfg.source_filter->argv[1] = xstrdup(name);
+		cgit_open_filter(ctx.cfg.source_filter);
+		write(STDOUT_FILENO, buf, size);
+		cgit_close_filter(ctx.cfg.source_filter);
+		html("</code></pre></td></tr></table>\n");
+		return;
+	}
+
 	html("<tr><td class='linenumbers'><pre>");
 	idx = 0;
 	lineno = 0;
@@ -65,7 +75,7 @@ 	}
 	html("</table>\n");
 }
 
-static void print_object(const unsigned char *sha1, char *path)
+static void print_object(const unsigned char *sha1, char *path, const char *basename)
 {
 	enum object_type type;
 	char *buf;
@@ -93,7 +103,7 @@
 	if (buffer_is_binary(buf, size))
 		print_binary_buffer(buf, size);
 	else
-		print_text_buffer(buf, size);
+		print_text_buffer(basename, buf, size);
 }
 
 
@@ -213,7 +223,7 @@ 			state = 1;
 			ls_head();
 			return READ_TREE_RECURSIVE;
 		} else {
-			print_object(sha1, buffer);
+			print_object(sha1, buffer, pathname);
 			return 0;
 		}
 	}