aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--man/blogcfile.5.ronn6
-rw-r--r--src/blogc-make/ctx.c11
-rw-r--r--src/blogc-make/ctx.h1
-rw-r--r--src/blogc-make/exec.c16
-rw-r--r--src/blogc-make/exec.h7
-rw-r--r--src/blogc-make/rules.c39
-rw-r--r--src/blogc-make/rules.h3
-rw-r--r--src/blogc-make/settings.c1
-rw-r--r--tests/blogc-make/check_exec.c54
9 files changed, 98 insertions, 40 deletions
diff --git a/man/blogcfile.5.ronn b/man/blogcfile.5.ronn
index faeb85f..efaa5bd 100644
--- a/man/blogcfile.5.ronn
+++ b/man/blogcfile.5.ronn
@@ -95,6 +95,12 @@ however these rules can be customized with the following settings, from the
option is useful if the user wants to host a page in the root of the website,
and move the posts listing index to a subdirectory.
+ * `listing_entry` (default: unset):
+ The page that will be included in the listing pages of the website, without
+ the page prefix and without the extension, only the "slug" should be used.
+ See blogc(1) and the description of `listing_entry` block in blogc-template(7)
+ for details.
+
* `locale` (default: unset):
The locale to be used when calling blogc(1). E.g. `en_US.UTF-8`.
diff --git a/src/blogc-make/ctx.c b/src/blogc-make/ctx.c
index 334a11d..b8b7bb6 100644
--- a/src/blogc-make/ctx.c
+++ b/src/blogc-make/ctx.c
@@ -256,6 +256,14 @@ bm_ctx_new(bm_ctx_t *base, const char *settings_file, const char *argv0,
const char *content_dir = bm_ctx_settings_lookup(rv, "content_dir");
const char *post_prefix = bm_ctx_settings_lookup(rv, "post_prefix");
const char *source_ext = bm_ctx_settings_lookup(rv, "source_ext");
+ const char *listing_entry = bm_ctx_settings_lookup(rv, "listing_entry");
+
+ rv->listing_entry_fctx = NULL;
+ if (listing_entry != NULL) {
+ char *f = bm_generate_filename(content_dir, NULL, listing_entry, source_ext);
+ rv->listing_entry_fctx = bm_filectx_new(rv, f, listing_entry, NULL);
+ free(f);
+ }
rv->posts_fctx = NULL;
if (settings->posts != NULL) {
@@ -317,6 +325,7 @@ bm_ctx_reload(bm_ctx_t **ctx)
bm_filectx_reload((*ctx)->main_template_fctx);
bm_filectx_reload((*ctx)->atom_template_fctx);
+ bm_filectx_reload((*ctx)->listing_entry_fctx);
for (bc_slist_t *tmp = (*ctx)->posts_fctx; tmp != NULL; tmp = tmp->next)
bm_filectx_reload((bm_filectx_t*) tmp->data);
@@ -357,6 +366,8 @@ bm_ctx_free_internal(bm_ctx_t *ctx)
ctx->atom_template_fctx = NULL;
bm_filectx_free(ctx->settings_fctx);
ctx->settings_fctx = NULL;
+ bm_filectx_free(ctx->listing_entry_fctx);
+ ctx->listing_entry_fctx = NULL;
bc_slist_free_full(ctx->posts_fctx, (bc_free_func_t) bm_filectx_free);
ctx->posts_fctx = NULL;
diff --git a/src/blogc-make/ctx.h b/src/blogc-make/ctx.h
index 80aa6ea..a66d51c 100644
--- a/src/blogc-make/ctx.h
+++ b/src/blogc-make/ctx.h
@@ -60,6 +60,7 @@ typedef struct {
bm_filectx_t *main_template_fctx;
bm_filectx_t *atom_template_fctx;
bm_filectx_t *settings_fctx;
+ bm_filectx_t *listing_entry_fctx;
bc_slist_t *posts_fctx;
bc_slist_t *pages_fctx;
diff --git a/src/blogc-make/exec.c b/src/blogc-make/exec.c
index cd71810..a78d506 100644
--- a/src/blogc-make/exec.c
+++ b/src/blogc-make/exec.c
@@ -219,7 +219,8 @@ list_variables(const char *key, const char *value, bc_string_t *str)
char*
bm_exec_build_blogc_cmd(const char *blogc_bin, bm_settings_t *settings,
bc_trie_t *global_variables, bc_trie_t *local_variables, bool listing,
- const char *template, const char *output, bool dev, bool sources_stdin)
+ const char *listing_entry, const char *template, const char *output,
+ bool dev, bool sources_stdin)
{
bc_string_t *rv = bc_string_new();
@@ -255,6 +256,11 @@ bm_exec_build_blogc_cmd(const char *blogc_bin, bm_settings_t *settings,
if (listing) {
bc_string_append(rv, " -l");
+ if (listing_entry != NULL) {
+ char *tmp = bc_shell_quote(listing_entry);
+ bc_string_append_printf(rv, " -e %s", tmp);
+ free(tmp);
+ }
}
if (template != NULL) {
@@ -279,8 +285,8 @@ bm_exec_build_blogc_cmd(const char *blogc_bin, bm_settings_t *settings,
int
bm_exec_blogc(bm_ctx_t *ctx, bc_trie_t *global_variables, bc_trie_t *local_variables,
- bool listing, bm_filectx_t *template, bm_filectx_t *output, bc_slist_t *sources,
- bool only_first_source)
+ bool listing, bm_filectx_t *listing_entry, bm_filectx_t *template,
+ bm_filectx_t *output, bc_slist_t *sources, bool only_first_source)
{
if (ctx == NULL)
return 1;
@@ -293,8 +299,8 @@ bm_exec_blogc(bm_ctx_t *ctx, bc_trie_t *global_variables, bc_trie_t *local_varia
}
char *cmd = bm_exec_build_blogc_cmd(ctx->blogc, ctx->settings, global_variables,
- local_variables, listing, template->path, output->path, ctx->dev,
- input->len > 0);
+ local_variables, listing, listing_entry == NULL ? NULL : listing_entry->path,
+ template->path, output->path, ctx->dev, input->len > 0);
if (ctx->verbose)
printf("%s\n", cmd);
diff --git a/src/blogc-make/exec.h b/src/blogc-make/exec.h
index 1d58c0d..e09e8ee 100644
--- a/src/blogc-make/exec.h
+++ b/src/blogc-make/exec.h
@@ -20,10 +20,11 @@ int bm_exec_command(const char *cmd, const char *input, char **output,
char **error, bc_error_t **err);
char* bm_exec_build_blogc_cmd(const char *blogc_bin, bm_settings_t *settings,
bc_trie_t *global_variables, bc_trie_t *local_variables, bool listing,
- const char *template, const char *output, bool dev, bool sources_stdin);
+ const char *listing_entry, const char *template, const char *output, bool dev,
+ bool sources_stdin);
int bm_exec_blogc(bm_ctx_t *ctx, bc_trie_t *global_variables, bc_trie_t *local_variables,
- bool listing, bm_filectx_t *template, bm_filectx_t *output, bc_slist_t *sources,
- bool only_first_source);
+ bool listing, bm_filectx_t *listing_entry, bm_filectx_t *template,
+ bm_filectx_t *output, bc_slist_t *sources, bool only_first_source);
int bm_exec_blogc_runserver(bm_ctx_t *ctx, const char *host, const char *port,
const char *threads);
diff --git a/src/blogc-make/rules.c b/src/blogc-make/rules.c
index 5361502..59d11f2 100644
--- a/src/blogc-make/rules.c
+++ b/src/blogc-make/rules.c
@@ -109,10 +109,10 @@ index_exec(bm_ctx_t *ctx, bc_slist_t *outputs, bc_trie_t *args)
if (fctx == NULL)
continue;
if (bm_rule_need_rebuild(ctx->posts_fctx, ctx->settings_fctx,
- ctx->main_template_fctx, fctx, false))
+ ctx->listing_entry_fctx, ctx->main_template_fctx, fctx, false))
{
- rv = bm_exec_blogc(ctx, variables, NULL, true, ctx->main_template_fctx,
- fctx, ctx->posts_fctx, false);
+ rv = bm_exec_blogc(ctx, variables, NULL, true, ctx->listing_entry_fctx,
+ ctx->main_template_fctx, fctx, ctx->posts_fctx, false);
if (rv != 0)
break;
}
@@ -167,10 +167,10 @@ atom_exec(bm_ctx_t *ctx, bc_slist_t *outputs, bc_trie_t *args)
bm_filectx_t *fctx = l->data;
if (fctx == NULL)
continue;
- if (bm_rule_need_rebuild(ctx->posts_fctx, ctx->settings_fctx, NULL,
+ if (bm_rule_need_rebuild(ctx->posts_fctx, ctx->settings_fctx, NULL, NULL,
fctx, false))
{
- rv = bm_exec_blogc(ctx, variables, NULL, true, ctx->atom_template_fctx,
+ rv = bm_exec_blogc(ctx, variables, NULL, true, NULL, ctx->atom_template_fctx,
fctx, ctx->posts_fctx, false);
if (rv != 0)
break;
@@ -233,10 +233,10 @@ atom_tags_exec(bm_ctx_t *ctx, bc_slist_t *outputs, bc_trie_t *args)
bc_trie_insert(variables, "FILTER_TAG",
bc_strdup(ctx->settings->tags[i]));
- if (bm_rule_need_rebuild(ctx->posts_fctx, ctx->settings_fctx, NULL,
+ if (bm_rule_need_rebuild(ctx->posts_fctx, ctx->settings_fctx, NULL, NULL,
fctx, false))
{
- rv = bm_exec_blogc(ctx, variables, NULL, true, ctx->atom_template_fctx,
+ rv = bm_exec_blogc(ctx, variables, NULL, true, NULL, ctx->atom_template_fctx,
fctx, ctx->posts_fctx, false);
if (rv != 0)
break;
@@ -310,10 +310,10 @@ pagination_exec(bm_ctx_t *ctx, bc_slist_t *outputs, bc_trie_t *args)
continue;
bc_trie_insert(variables, "FILTER_PAGE", bc_strdup_printf("%zu", page));
if (bm_rule_need_rebuild(ctx->posts_fctx, ctx->settings_fctx,
- ctx->main_template_fctx, fctx, false))
+ ctx->listing_entry_fctx, ctx->main_template_fctx, fctx, false))
{
- rv = bm_exec_blogc(ctx, variables, NULL, true, ctx->main_template_fctx,
- fctx, ctx->posts_fctx, false);
+ rv = bm_exec_blogc(ctx, variables, NULL, true, ctx->listing_entry_fctx,
+ ctx->main_template_fctx, fctx, ctx->posts_fctx, false);
if (rv != 0)
break;
}
@@ -373,12 +373,12 @@ posts_exec(bm_ctx_t *ctx, bc_slist_t *outputs, bc_trie_t *args)
bm_filectx_t *o_fctx = o->data;
if (o_fctx == NULL)
continue;
- if (bm_rule_need_rebuild(s, ctx->settings_fctx,
+ if (bm_rule_need_rebuild(s, ctx->settings_fctx, NULL,
ctx->main_template_fctx, o_fctx, true))
{
bc_trie_t *local = bc_trie_new(NULL);
bc_trie_insert(local, "MAKE_SLUG", s_fctx->slug); // no need to copy
- rv = bm_exec_blogc(ctx, variables, local, false, ctx->main_template_fctx,
+ rv = bm_exec_blogc(ctx, variables, local, false, NULL, ctx->main_template_fctx,
o_fctx, s, true);
bc_trie_free(local);
if (rv != 0)
@@ -444,10 +444,10 @@ tags_exec(bm_ctx_t *ctx, bc_slist_t *outputs, bc_trie_t *args)
bc_strdup(ctx->settings->tags[i]));
if (bm_rule_need_rebuild(ctx->posts_fctx, ctx->settings_fctx,
- ctx->main_template_fctx, fctx, false))
+ ctx->listing_entry_fctx, ctx->main_template_fctx, fctx, false))
{
- rv = bm_exec_blogc(ctx, variables, NULL, true, ctx->main_template_fctx,
- fctx, ctx->posts_fctx, false);
+ rv = bm_exec_blogc(ctx, variables, NULL, true, ctx->listing_entry_fctx,
+ ctx->main_template_fctx, fctx, ctx->posts_fctx, false);
if (rv != 0)
break;
}
@@ -504,12 +504,12 @@ pages_exec(bm_ctx_t *ctx, bc_slist_t *outputs, bc_trie_t *args)
bm_filectx_t *o_fctx = o->data;
if (o_fctx == NULL)
continue;
- if (bm_rule_need_rebuild(s, ctx->settings_fctx,
+ if (bm_rule_need_rebuild(s, ctx->settings_fctx, NULL,
ctx->main_template_fctx, o_fctx, true))
{
bc_trie_t *local = bc_trie_new(NULL);
bc_trie_insert(local, "MAKE_SLUG", s_fctx->slug); // no need to copy
- rv = bm_exec_blogc(ctx, variables, local, false, ctx->main_template_fctx,
+ rv = bm_exec_blogc(ctx, variables, local, false, NULL, ctx->main_template_fctx,
o_fctx, s, true);
bc_trie_free(local);
if (rv != 0)
@@ -562,7 +562,7 @@ copy_exec(bm_ctx_t *ctx, bc_slist_t *outputs, bc_trie_t *args)
if (o_fctx == NULL)
continue;
- if (bm_rule_need_rebuild(s, ctx->settings_fctx, NULL, o_fctx, true)) {
+ if (bm_rule_need_rebuild(s, ctx->settings_fctx, NULL, NULL, o_fctx, true)) {
rv = bm_exec_native_cp(s->data, o_fctx, ctx->verbose);
if (rv != 0)
break;
@@ -860,7 +860,8 @@ bm_rule_execute(bm_ctx_t *ctx, const bm_rule_t *rule, bc_trie_t *args)
bool
bm_rule_need_rebuild(bc_slist_t *sources, bm_filectx_t *settings,
- bm_filectx_t *template, bm_filectx_t *output, bool only_first_source)
+ bm_filectx_t *listing_entry, bm_filectx_t *template, bm_filectx_t *output,
+ bool only_first_source)
{
if (output == NULL || !output->readable)
return true;
diff --git a/src/blogc-make/rules.h b/src/blogc-make/rules.h
index 5fcc1eb..29ba27e 100644
--- a/src/blogc-make/rules.h
+++ b/src/blogc-make/rules.h
@@ -29,7 +29,8 @@ bc_trie_t* bm_rule_parse_args(const char *sep);
int bm_rule_executor(bm_ctx_t *ctx, bc_slist_t *rule_list);
int bm_rule_execute(bm_ctx_t *ctx, const bm_rule_t *rule, bc_trie_t *args);
bool bm_rule_need_rebuild(bc_slist_t *sources, bm_filectx_t *settings,
- bm_filectx_t *template, bm_filectx_t *output, bool only_first_source);
+ bm_filectx_t *listing_entry, bm_filectx_t *template, bm_filectx_t *output,
+ bool only_first_source);
bc_slist_t* bm_rule_list_built_files(bm_ctx_t *ctx);
void bm_rule_print_help(void);
diff --git a/src/blogc-make/settings.c b/src/blogc-make/settings.c
index deed018..05e610a 100644
--- a/src/blogc-make/settings.c
+++ b/src/blogc-make/settings.c
@@ -27,6 +27,7 @@ static const struct default_settings_map {
{"atom_template", NULL}, // default: atom.c
{"main_template", "main.tmpl"},
{"source_ext", ".txt"},
+ {"listing_entry", NULL},
// pagination
{"pagination_prefix", "page"},
diff --git a/tests/blogc-make/check_exec.c b/tests/blogc-make/check_exec.c
index 32c7fae..8193ad7 100644
--- a/tests/blogc-make/check_exec.c
+++ b/tests/blogc-make/check_exec.c
@@ -88,20 +88,27 @@ test_build_blogc_cmd_with_settings(void **state)
settings->tags = NULL;
char *rv = bm_exec_build_blogc_cmd("blogc", settings, variables, local, true,
- "main.tmpl", "foo.html", false, true);
+ NULL, "main.tmpl", "foo.html", false, true);
assert_string_equal(rv,
"LC_ALL='en_US.utf8' blogc -D FOO='BAR' -D BAR='BAZ' -D LOL='HEHE' "
"-D ASD='QWE' -l -t 'main.tmpl' -o 'foo.html' -i");
free(rv);
+ rv = bm_exec_build_blogc_cmd("blogc", settings, variables, local, true,
+ "foo.txt", "main.tmpl", "foo.html", false, true);
+ assert_string_equal(rv,
+ "LC_ALL='en_US.utf8' blogc -D FOO='BAR' -D BAR='BAZ' -D LOL='HEHE' "
+ "-D ASD='QWE' -l -e 'foo.txt' -t 'main.tmpl' -o 'foo.html' -i");
+ free(rv);
+
rv = bm_exec_build_blogc_cmd("blogc", settings, variables, NULL, false, NULL,
- NULL, false, false);
+ NULL, NULL, false, false);
assert_string_equal(rv,
"LC_ALL='en_US.utf8' blogc -D FOO='BAR' -D BAR='BAZ' -D LOL='HEHE'");
free(rv);
rv = bm_exec_build_blogc_cmd("blogc", settings, NULL, NULL, false, NULL, NULL,
- false, false);
+ NULL, false, false);
assert_string_equal(rv,
"LC_ALL='en_US.utf8' blogc -D FOO='BAR' -D BAR='BAZ'");
free(rv);
@@ -130,22 +137,30 @@ test_build_blogc_cmd_with_settings_and_dev(void **state)
settings->tags = NULL;
char *rv = bm_exec_build_blogc_cmd("blogc", settings, variables, local, true,
- "main.tmpl", "foo.html", true, true);
+ NULL, "main.tmpl", "foo.html", true, true);
assert_string_equal(rv,
"LC_ALL='en_US.utf8' blogc -D FOO='BAR' -D BAR='BAZ' -D LOL='HEHE' "
"-D ASD='QWE' -D MAKE_ENV_DEV=1 -D MAKE_ENV='dev' -l -t 'main.tmpl' "
"-o 'foo.html' -i");
free(rv);
+ rv = bm_exec_build_blogc_cmd("blogc", settings, variables, local, true,
+ "foo.txt", "main.tmpl", "foo.html", true, true);
+ assert_string_equal(rv,
+ "LC_ALL='en_US.utf8' blogc -D FOO='BAR' -D BAR='BAZ' -D LOL='HEHE' "
+ "-D ASD='QWE' -D MAKE_ENV_DEV=1 -D MAKE_ENV='dev' -l -e 'foo.txt' "
+ "-t 'main.tmpl' -o 'foo.html' -i");
+ free(rv);
+
rv = bm_exec_build_blogc_cmd("blogc", settings, variables, NULL, false, NULL,
- NULL, true, false);
+ NULL, NULL, true, false);
assert_string_equal(rv,
"LC_ALL='en_US.utf8' blogc -D FOO='BAR' -D BAR='BAZ' -D LOL='HEHE' "
"-D MAKE_ENV_DEV=1 -D MAKE_ENV='dev'");
free(rv);
rv = bm_exec_build_blogc_cmd("blogc", settings, NULL, NULL, false, NULL, NULL,
- true, false);
+ NULL, true, false);
assert_string_equal(rv,
"LC_ALL='en_US.utf8' blogc -D FOO='BAR' -D BAR='BAZ' "
"-D MAKE_ENV_DEV=1 -D MAKE_ENV='dev'");
@@ -175,22 +190,30 @@ test_build_blogc_cmd_with_settings_and_tags(void **state)
settings->tags = bc_str_split("asd foo bar", ' ', 0);
char *rv = bm_exec_build_blogc_cmd("blogc", settings, variables, local, true,
- "main.tmpl", "foo.html", true, true);
+ NULL, "main.tmpl", "foo.html", true, true);
assert_string_equal(rv,
"LC_ALL='en_US.utf8' blogc -D MAKE_TAGS='asd foo bar' -D FOO='BAR' "
"-D BAR='BAZ' -D LOL='HEHE' -D ASD='QWE' -D MAKE_ENV_DEV=1 "
"-D MAKE_ENV='dev' -l -t 'main.tmpl' -o 'foo.html' -i");
free(rv);
+ rv = bm_exec_build_blogc_cmd("blogc", settings, variables, local, true,
+ "foo.txt", "main.tmpl", "foo.html", true, true);
+ assert_string_equal(rv,
+ "LC_ALL='en_US.utf8' blogc -D MAKE_TAGS='asd foo bar' -D FOO='BAR' "
+ "-D BAR='BAZ' -D LOL='HEHE' -D ASD='QWE' -D MAKE_ENV_DEV=1 "
+ "-D MAKE_ENV='dev' -l -e 'foo.txt' -t 'main.tmpl' -o 'foo.html' -i");
+ free(rv);
+
rv = bm_exec_build_blogc_cmd("blogc", settings, variables, NULL, false, NULL,
- NULL, true, false);
+ NULL, NULL, true, false);
assert_string_equal(rv,
"LC_ALL='en_US.utf8' blogc -D MAKE_TAGS='asd foo bar' -D FOO='BAR' "
"-D BAR='BAZ' -D LOL='HEHE' -D MAKE_ENV_DEV=1 -D MAKE_ENV='dev'");
free(rv);
rv = bm_exec_build_blogc_cmd("blogc", settings, NULL, NULL, false, NULL, NULL,
- true, false);
+ NULL, true, false);
assert_string_equal(rv,
"LC_ALL='en_US.utf8' blogc -D MAKE_TAGS='asd foo bar' -D FOO='BAR' "
"-D BAR='BAZ' -D MAKE_ENV_DEV=1 -D MAKE_ENV='dev'");
@@ -214,19 +237,26 @@ test_build_blogc_cmd_without_settings(void **state)
bc_trie_insert(local, "ASD", bc_strdup("QWE"));
char *rv = bm_exec_build_blogc_cmd("blogc", NULL, variables, local, true,
- "main.tmpl", "foo.html", false, true);
+ NULL, "main.tmpl", "foo.html", false, true);
assert_string_equal(rv,
"blogc -D LOL='HEHE' -D ASD='QWE' -l -t 'main.tmpl' -o 'foo.html' -i");
free(rv);
+ rv = bm_exec_build_blogc_cmd("blogc", NULL, variables, local, true,
+ "foo.txt", "main.tmpl", "foo.html", false, true);
+ assert_string_equal(rv,
+ "blogc -D LOL='HEHE' -D ASD='QWE' -l -e 'foo.txt' -t 'main.tmpl' "
+ "-o 'foo.html' -i");
+ free(rv);
+
rv = bm_exec_build_blogc_cmd("blogc", NULL, variables, NULL, false, NULL,
- NULL, false, false);
+ NULL, NULL, false, false);
assert_string_equal(rv,
"blogc -D LOL='HEHE'");
free(rv);
rv = bm_exec_build_blogc_cmd("blogc", NULL, NULL, NULL, false, NULL, NULL,
- false, false);
+ NULL, false, false);
assert_string_equal(rv,
"blogc");
free(rv);