[PATCH v3 05/17] Parse render filters from the config

John Keeping john at keeping.me.uk
Tue Jun 19 23:37:48 CEST 2018


On Tue, Jun 19, 2018 at 05:01:51PM +0800, Andy Green wrote:
> 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.
> 
> AG: adapted so render.= can be used to specify the filter for files
> without any suffix
> 
> Signed-off-by: John Keeping <john at keeping.me.uk>
> Signed-off-by: Andy Green <andy at warmcat.com>

For your change,

Reviewed-by: John Keeping <john at keeping.me.uk>

> ---
>  cgit.c       |   19 +++++++++++++++++--
>  cgit.h       |    4 +++-
>  cgitrc.5.txt |   19 +++++++++++++++++++
>  filter.c     |    1 +
>  shared.c     |   19 +++++++++++++++++++
>  5 files changed, 59 insertions(+), 3 deletions(-)
> 
> diff --git a/cgit.c b/cgit.c
> index 0c9f3e9..e0e94d5 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)
> @@ -281,8 +293,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);
>  }
> @@ -415,6 +429,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 6feca68..3149946 100644
> --- a/cgit.h
> +++ b/cgit.h
> @@ -57,7 +57,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;
> @@ -391,5 +392,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 f6f6502..34b6186 100644
> --- a/cgitrc.5.txt
> +++ b/cgitrc.5.txt
> @@ -342,6 +342,18 @@ 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.  Note <ext> may be empty, in
> +	which case the render filter is used on files with no suffix.
> ++
> +Default value: none. See also: "FILTER API".
> +
>  repository-sort::
>  	The way in which repositories in each section are sorted. Valid values
>  	are "name" for sorting by the repo name or "age" for sorting by the
> @@ -705,6 +717,13 @@ owner filter::
>  	standard input and the filter is expected to write to standard
>  	output.  The output is included in the Owner column.
>  
> +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.
> +
>  source filter::
>  	This filter is given a single parameter: the filename of the source
>  	file to filter. The filter can use the filename to determine (for
> 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 d7c7636..665f8ed 100644
> --- a/shared.c
> +++ b/shared.c
> @@ -574,3 +574,22 @@ 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)
> +		ext = ".";
> +	++ext;

It took me a minute to realise that this wasn't looking for "render..",
is the following clearer?

	if (!ext)
		ext = "";
	else
		++ext;

> +	item = string_list_lookup(&ctx.cfg.render_filters, ext);
> +	if (item)
> +		return item->util;
> +
> +	return NULL;
> +}


More information about the CGit mailing list