about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--cgit.c2
-rw-r--r--cgit.h1
-rw-r--r--cgitrc.5.txt8
-rw-r--r--ui-tree.c18
4 files changed, 25 insertions, 4 deletions
diff --git a/cgit.c b/cgit.c
index 779a464..eb7b45d 100644
--- a/cgit.c
+++ b/cgit.c
@@ -100,6 +100,8 @@ void config_cb(const char *name, const char *value)
 		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 d0fff1f..f9cf0df 100644
--- a/cgit.h
+++ b/cgit.h
@@ -183,6 +183,7 @@ struct cgit_config {
 	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 a207fe0..d420ad4 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -198,6 +198,14 @@ snapshots::
 		"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 553dbaa..816e121 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 @@ static void print_binary_buffer(char *buf, unsigned long size)
 	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 @@ static void print_object(const unsigned char *sha1, char *path)
 	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 @@ static int walk_tree(const unsigned char *sha1, const char *base, int baselen,
 			ls_head();
 			return READ_TREE_RECURSIVE;
 		} else {
-			print_object(sha1, buffer);
+			print_object(sha1, buffer, pathname);
 			return 0;
 		}
 	}