]> granicus.if.org Git - cgit/commitdiff
Parse render filters from the config
authorJohn Keeping <john@keeping.me.uk>
Mon, 18 Jun 2018 06:22:12 +0000 (14:22 +0800)
committerAndy Green <andy@warmcat.com>
Thu, 28 Jun 2018 23:53:20 +0000 (07:53 +0800)
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@keeping.me.uk>
Signed-off-by: Andy Green <andy@warmcat.com>
Reviewed-by: John Keeping <john@keeping.me.uk>
cgit.c
cgit.h
cgitrc.5.txt
filter.c
shared.c

diff --git a/cgit.c b/cgit.c
index 0c9f3e9a1b3cf854e39f8cffc432201cdd1be183..e0e94d56b1f8e232899bde6a55d5fb077a1f7633 100644 (file)
--- 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 6e6750c579f6ee81829df853f3f71dcc3f21cad9..5dc77dbaf7c51405805ee637716d079d1dcf8c39 100644 (file)
--- 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;
@@ -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 */
index f6f6502fa2df7d754c8b698d9f54c67dc460a3cd..34b618680b88c7ff81748f53fce906c033725570 100644 (file)
@@ -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
index 70f5b749989c27e8bf1e87070066614805dbf5d6..4ae4aaa2418cfdf134edbab2642953e5b8e7e33f 100644 (file)
--- 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;
 
index 6cda79e189721a59c75d4bb28f76a5ebe5691d56..aad0024c81b29fe2ba5bd7a35d19151527e3bf89 100644 (file)
--- 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;
+       item = string_list_lookup(&ctx.cfg.render_filters, ext);
+       if (item)
+               return item->util;
+
+       return NULL;
+}