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 = "%1$d\n"; html("\n"); + if (ctx.cfg.source_filter) { + html("
");
+		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("
\n"); + return; + } + html("
");
 	idx = 0;
 	lineno = 0;
@@ -65,7 +75,7 @@ static void print_binary_buffer(char *buf, unsigned long size)
 	html("\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;
 		}
 	}