From mboxrd@z Thu Jan 1 00:00:00 1970 From: john at keeping.me.uk (John Keeping) Date: Tue, 19 Jun 2018 22:37:48 +0100 Subject: [PATCH v3 05/17] Parse render filters from the config In-Reply-To: <152939891186.4492.5091929061132986076.stgit@mail.warmcat.com> References: <152939875224.4492.4288866616332837866.stgit@mail.warmcat.com> <152939891186.4492.5091929061132986076.stgit@mail.warmcat.com> Message-ID: <20180619213748.GZ1922@john.keeping.me.uk> On Tue, Jun 19, 2018 at 05:01:51PM +0800, Andy Green wrote: > From: John Keeping > > 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 > Signed-off-by: Andy Green For your change, Reviewed-by: John Keeping > --- > 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.:: > + Specifies a command which will be invoked to render files with the > + extension `.`. 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 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; > +}