aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
7 files changed, 50 insertions, 28 deletions
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"},