List for cgit developers and users
 help / color / mirror / Atom feed
From: andy at warmcat.com (Andy Green)
Subject: [PATCH 03/11] Parse render filters from the config
Date: Wed, 13 Jun 2018 10:01:45 +0800	[thread overview]
Message-ID: <152885530520.7253.16631909889552963987.stgit@mail.warmcat.com> (raw)
In-Reply-To: <152885510454.7253.3542488576272033383.stgit@mail.warmcat.com>

From: John Keeping <john at keeping.me.uk>

Render filters will be used to present rendered content in the tree
view, for example to display Markdown source rendered as HTML.

We will add support for using these from the tree view in the following
commits.

Signed-off-by: John Keeping <john at keeping.me.uk>
---
 cgit.c       |   19 +++++++++++++++++--
 cgit.h       |    4 +++-
 cgitrc.5.txt |   18 ++++++++++++++++++
 filter.c     |    1 +
 shared.c     |   21 +++++++++++++++++++++
 5 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/cgit.c b/cgit.c
index b37d3e0..975e573 100644
--- a/cgit.c
+++ b/cgit.c
@@ -27,6 +27,18 @@ static void add_mimetype(const char *name, const char *value)
 	item->util = xstrdup(value);
 }
 
+static void add_render_filter(const char *name, const char *cmd)
+{
+	struct string_list_item *item;
+	struct cgit_filter *filter = cgit_new_filter(cmd, RENDER);
+
+	if (!filter)
+		return;
+
+	item = string_list_insert(&ctx.cfg.render_filters, name);
+	item->util = filter;
+}
+
 static void process_cached_repolist(const char *path);
 
 static void repo_config(struct cgit_repo *repo, const char *name, const char *value)
@@ -285,8 +297,10 @@ static void config_cb(const char *name, const char *value)
 			ctx.cfg.branch_sort = 1;
 		if (!strcmp(value, "name"))
 			ctx.cfg.branch_sort = 0;
-	} else if (skip_prefix(name, "mimetype.", &arg))
-		add_mimetype(arg, value);
+	} else if (starts_with(name, "mimetype."))
+		add_mimetype(name + 9, value);
+	else if (starts_with(name, "render."))
+		add_render_filter(name + 7, value);
 	else if (!strcmp(name, "include"))
 		parse_configfile(expand_macros(value), config_cb);
 }
@@ -420,6 +434,7 @@ static void prepare_context(void)
 	ctx.page.expires = ctx.page.modified;
 	ctx.page.etag = NULL;
 	string_list_init(&ctx.cfg.mimetypes, 1);
+	string_list_init(&ctx.cfg.render_filters, 1);
 	if (ctx.env.script_name)
 		ctx.cfg.script_name = xstrdup(ctx.env.script_name);
 	if (ctx.env.query_string)
diff --git a/cgit.h b/cgit.h
index 005ae63..a19742f 100644
--- a/cgit.h
+++ b/cgit.h
@@ -55,7 +55,7 @@ typedef enum {
 } diff_type;
 
 typedef enum {
-	ABOUT, COMMIT, SOURCE, EMAIL, AUTH, OWNER
+	ABOUT, COMMIT, SOURCE, EMAIL, AUTH, OWNER, RENDER
 } filter_type;
 
 struct cgit_filter {
@@ -261,6 +261,7 @@ struct cgit_config {
 	int branch_sort;
 	int commit_sort;
 	struct string_list mimetypes;
+	struct string_list render_filters;
 	struct cgit_filter *about_filter;
 	struct cgit_filter *commit_filter;
 	struct cgit_filter *source_filter;
@@ -389,5 +390,6 @@ extern int readfile(const char *path, char **buf, size_t *size);
 extern char *expand_macros(const char *txt);
 
 extern char *get_mimetype_for_filename(const char *filename);
+extern struct cgit_filter *get_render_for_filename(const char *filename);
 
 #endif /* CGIT_H */
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index 4da166c..793a0c1 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -359,6 +359,17 @@ renamelimit::
 	 "-1" uses the compiletime value in git (for further info, look at
 	  `man git-diff`). Default value: "-1".
 
+render.<ext>::
+	Specifies a command which will be invoked to render files with the
+	extension `.<ext>`. 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 in the page content. If no
+	render filter is available for a given file extension but the mimetype
+	is specified then the content will be included as an iframe, otherwise
+	the normal source rendering will be used.
++
+Default value: none. See also: "FILTER API".
+
 repo.group::
 	Legacy alias for "section". This option is deprecated and will not be
 	supported in cgit-1.0.
@@ -699,6 +710,13 @@ source filter::
 	file that is to be filtered is available on standard input and the
 	filtered contents is expected on standard output.
 
+render filter::
+	This filter is given a single parameter: the filename of the source
+	file to render. The filter can use the filename to determine (for
+	example) the syntax highlighting mode. The contents of the file that
+	is to be rendered is available on standard input and the rendered
+	content is expected on standard output.
+
 auth filter::
 	The authentication filter receives 12 parameters:
 	  - filter action, explained below, which specifies which action the
diff --git a/filter.c b/filter.c
index 70f5b74..4ae4aaa 100644
--- a/filter.c
+++ b/filter.c
@@ -434,6 +434,7 @@ struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype)
 
 		case SOURCE:
 		case ABOUT:
+		case RENDER:
 			argument_count = 1;
 			break;
 
diff --git a/shared.c b/shared.c
index 477db0a..128c323 100644
--- a/shared.c
+++ b/shared.c
@@ -571,3 +571,24 @@ char *get_mimetype_for_filename(const char *filename)
 	fclose(file);
 	return NULL;
 }
+
+struct cgit_filter *get_render_for_filename(const char *filename)
+{
+	char *ext;
+	struct string_list_item *item;
+
+	if (!filename)
+		return NULL;
+
+	ext = strrchr(filename, '.');
+	if (!ext)
+		return NULL;
+	++ext;
+	if (!ext[0])
+		return NULL;
+	item = string_list_lookup(&ctx.cfg.render_filters, ext);
+	if (item)
+		return item->util;
+
+	return NULL;
+}



  parent reply	other threads:[~2018-06-13  2:01 UTC|newest]

Thread overview: 140+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-11  7:08 Rendering of README.md inline with inner tree view dirs andy
2018-06-11  7:31 ` list
2018-06-11  7:38   ` andy
2018-06-11  7:53     ` list
2018-06-11  8:05       ` andy
2018-06-11 15:38         ` john
2018-06-12  5:53           ` andy
2018-06-12  8:35             ` list
2018-06-12  9:24               ` john
2018-06-12  9:27                 ` andy
2018-06-12 12:07                   ` john
2018-06-12  9:31             ` john
2018-06-13  1:47               ` andy
2018-06-13  2:01                 ` [PATCH 00/11] Render READMEs inline in tree view andy
2018-06-13  2:01                   ` [PATCH 01/11] Use string list strdup_strings for mimetypes andy
2018-06-13  2:01                   ` [PATCH 02/11] Add source page andy
2018-06-13  2:01                   ` andy [this message]
2018-06-13  2:01                   ` [PATCH 04/11] ui-tree: split out buffer printing andy
2018-06-13  2:01                   ` [PATCH 05/11] ui-tree: use render fileters to display content andy
2018-06-16 14:26                     ` john
2018-06-16 23:16                       ` andy
2018-06-13  2:02                   ` [PATCH 06/11] ui-tree: free read_sha1_file() buffer after use andy
2018-06-16 14:24                     ` john
2018-06-13  2:02                   ` [PATCH 07/11] ui-blame: " andy
2018-06-16 14:23                     ` john
2018-06-16 23:17                       ` andy
2018-06-13  2:02                   ` [PATCH 08/11] ui-tree: print_object: add is_inline param andy
2018-06-16 14:38                     ` john
2018-06-13  2:02                   ` [PATCH 09/11] ui-tree: ls_tail: add walk table param andy
2018-06-16 14:38                     ` john
2018-06-13  2:02                   ` [PATCH 10/11] config: add tree-readme list andy
2018-06-16 14:44                     ` john
2018-06-13  2:02                   ` [PATCH 11/11] ui-tree: render any matching README file in tree view andy
2018-06-16 14:58                     ` john
2018-06-14  3:47                   ` [PATCH 00/11] Render READMEs inline " andy
2018-06-16 14:17                     ` john
2018-06-19  9:01                   ` [PATCH v3 00/17] " andy
2018-06-19  9:01                     ` [PATCH v3 01/17] manpage: fix sorting order andy
2018-06-19 21:35                       ` john
2018-06-19  9:01                     ` [PATCH v3 02/17] blame: css: make blame highlight div absolute and at parent top andy
2018-06-19  9:01                     ` [PATCH v3 03/17] Use string list strdup_strings for mimetypes andy
2018-06-19  9:01                     ` [PATCH v3 04/17] Add source page andy
2018-06-19  9:01                     ` [PATCH v3 05/17] Parse render filters from the config andy
2018-06-19 21:37                       ` john
2018-06-19  9:01                     ` [PATCH v3 06/17] ui-tree: split out buffer printing andy
2018-06-19  9:02                     ` [PATCH v3 07/17] ui-tree: use render filters to display content andy
2018-06-19  9:02                     ` [PATCH v3 08/17] ui-blame: free read_sha1_file() buffer after use andy
2018-06-19 21:46                       ` john
2018-06-19  9:02                     ` [PATCH v3 09/17] ui-tree: ls_tail: add walk table param andy
2018-06-19  9:02                     ` [PATCH v3 10/17] config: add global inline-readme list andy
2018-06-19  9:02                     ` [PATCH v3 11/17] config: add repo " andy
2018-06-19  9:02                     ` [PATCH v3 12/17] ui-tree: render any matching README file in tree view andy
2018-06-19 21:49                       ` john
2018-06-20  0:00                         ` andy
2018-06-19  9:02                     ` [PATCH v3 13/17] md2html: add asset mapping andy
2018-06-19  9:02                     ` [PATCH v3 14/17] md2html-add-asset-postfix-arg andy
2018-06-19  9:02                     ` [PATCH v3 15/17] ui-shared: deduplicate some code in repolink andy
2018-06-19 21:48                       ` john
2018-06-19  9:02                     ` [PATCH v3 16/17] ui-shared: add helper for generating non-urlencoded links andy
2018-06-19 21:55                       ` john
2018-06-20  0:07                         ` andy
2018-06-19  9:02                     ` [PATCH v3 17/17] render: adapt for providing extra filter args for plain andy
2018-06-19 21:56                       ` john
2018-06-20 10:11                   ` [PATCH v4 00/16] Render READMEs inline in tree view andy
2018-06-20 10:12                     ` [PATCH v4 01/16] manpage: fix sorting order andy
2018-06-27 17:27                       ` Jason
2018-06-20 10:12                     ` [PATCH v4 02/16] Use string list strdup_strings for mimetypes andy
2018-06-27 17:28                       ` Jason
2018-06-20 10:12                     ` [PATCH v4 03/16] Add source page andy
2018-06-20 10:12                     ` [PATCH v4 04/16] Parse render filters from the config andy
2018-06-20 10:12                     ` [PATCH v4 05/16] ui-tree: split out buffer printing andy
2018-06-20 10:12                     ` [PATCH v4 06/16] ui-tree: use render filters to display content andy
2018-06-20 10:12                     ` [PATCH v4 07/16] ui-tree: ls_tail: add walk table param andy
2018-06-20 10:12                     ` [PATCH v4 08/16] config: add global inline-readme list andy
2018-06-20 10:12                     ` [PATCH v4 09/16] config: add repo " andy
2018-06-20 10:12                     ` [PATCH v4 10/16] ui-tree: render any matching README file in tree view andy
2018-06-20 10:12                     ` [PATCH v4 11/16] md2html: add asset mapping andy
2018-06-27 17:32                       ` Jason
2018-06-27 20:00                         ` john
2018-06-20 10:12                     ` [PATCH v4 12/16] md2html: add asset postfix arg andy
2018-06-20 10:13                     ` [PATCH v4 13/16] ui-shared: deduplicate some code in repolink andy
2018-06-27 17:29                       ` Jason
2018-06-27 17:50                         ` Jason
2018-06-20 10:13                     ` [PATCH v4 14/16] ui-shared: add helper for generating non-urlencoded links andy
2018-06-20 10:13                     ` [PATCH v4 15/16] render: adapt for providing extra filter args for plain andy
2018-06-20 10:41                       ` andy
2018-06-20 10:13                     ` [PATCH v4 16/16] md2html: change css name to not conflict with highlight andy
2018-06-27 17:37                       ` Jason
2018-06-27 21:58                         ` andy
2018-06-28  8:32                           ` john
2018-06-23 11:04                     ` [PATCH v4 00/16] Render READMEs inline in tree view john
2018-06-23 11:10                       ` andy
2018-06-27 17:18                     ` Jason
2018-06-27 17:26                       ` Fancier Source view [Was: Re: [PATCH v4 00/16] Render READMEs inline in tree view] Jason
2018-06-27 20:05                         ` john
2018-06-27 19:51                       ` [PATCH v4 00/16] Render READMEs inline in tree view john
2018-06-27 22:48                         ` andy
2018-06-27 23:22                         ` Jason
2018-06-28  8:28                           ` john
2018-07-03 19:34                             ` Jason
2018-07-03 19:53                               ` john
2018-07-03 19:58                                 ` Jason
2018-06-27 22:36                       ` andy
2018-06-27 22:46                         ` Jason
2018-06-27 23:08                           ` andy
2018-06-16 14:12                 ` Rendering of README.md inline with inner tree view dirs john
2018-06-16 17:35                   ` john
2018-06-18  2:22                     ` andy
2018-06-18  2:56               ` [PATCH v2 00/15] Render READMEs inline in tree view andy
2018-06-18  2:57                 ` [PATCH v2 01/15] manpage: fix sorting order andy
2018-06-18  2:57                 ` [PATCH v2 02/15] gcc8.1: fix strncat warning andy
2018-07-03 23:45                   ` Jason
2018-07-03 23:47                     ` andy
2018-07-03 23:50                       ` Jason
2018-06-18  2:57                 ` [PATCH v2 03/15] Use string list strdup_strings for mimetypes andy
2018-06-18  2:57                 ` [PATCH v2 04/15] Add source page andy
2018-06-18 19:08                   ` john
2018-06-18 19:27                     ` andy
2018-06-18  2:57                 ` [PATCH v2 05/15] Parse render filters from the config andy
2018-06-18  2:57                 ` [PATCH v2 06/15] ui-tree: split out buffer printing andy
2018-06-18  2:57                 ` [PATCH v2 07/15] ui-tree: use render filters to display content andy
2018-06-18  2:57                 ` [PATCH v2 08/15] ui-blame: free read_sha1_file() buffer after use andy
2018-06-18  2:58                 ` [PATCH v2 09/15] ui-tree: ls_tail: add walk table param andy
2018-06-18  2:58                 ` [PATCH v2 10/15] config: add global inline-readme list andy
2018-06-18 19:32                   ` john
2018-06-18  2:58                 ` [PATCH v2 11/15] config: add repo " andy
2018-06-18 19:30                   ` john
2018-06-18  2:58                 ` [PATCH v2 12/15] ui-tree: render any matching README file in tree view andy
2018-06-18 19:36                   ` john
2018-06-19  1:55                     ` andy
2018-06-19  8:31                       ` john
2018-06-19  8:38                         ` andy
2018-06-18  2:58                 ` [PATCH v2 13/15] md2html: add asset mapping andy
2018-06-18  2:58                 ` [PATCH v2 14/15] md2html-add-asset-postfix-arg andy
2018-06-18 19:21                   ` john
2018-06-19  3:55                     ` andy
2018-06-19  8:34                       ` john
2018-06-18  2:58                 ` [PATCH v2 15/15] render: adapt for providing extra filter args for plain andy
2018-06-18 19:25                   ` john
2018-06-19  3:34                     ` andy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=152885530520.7253.16631909889552963987.stgit@mail.warmcat.com \
    --to=cgit@lists.zx2c4.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).