From 69caadbe08b27188ac0ab3bd0e49bf3ee4f8244c Mon Sep 17 00:00:00 2001 From: "Rafael G. Martins" Date: Thu, 26 Jul 2018 20:28:40 +0200 Subject: make: allow custom atom templates --- man/blogcfile.5.ronn | 15 +- src/blogc-make/ctx.c | 29 +++- src/blogc-make/ctx.h | 1 + src/blogc-make/settings.c | 1 + tests/blogc-make/check_blogc_make.sh.in | 251 ++++++++++++++++++++++++++++++++ 5 files changed, 285 insertions(+), 12 deletions(-) diff --git a/man/blogcfile.5.ronn b/man/blogcfile.5.ronn index cbda4c4..edca45c 100644 --- a/man/blogcfile.5.ronn +++ b/man/blogcfile.5.ronn @@ -43,6 +43,12 @@ however these rules can be customized with the following settings, from the * `atom_ext` (default: `.xml`): The extension of the generated Atom feeds. + * `atom_legacy_entry_id` (default: `false`): + Before `0.14.0` blogc-make was generating "broken" entry IDs in the atom feeds. + This behavior was fixed in version `0.14.0` and current users that don't want + to have their old posts re-shared due to the change of IDs should set this to + `true`, to keep using the old format. + * `atom_order` (default: `DESC`): The ordering (`ASC` or `DESC`) of the Atom feeds. Please note that the files are not sorted by date, they are sorted by their order in the `[posts]` @@ -58,11 +64,10 @@ however these rules can be customized with the following settings, from the be `atom.xml`, the Atom feed for the `foo` tag will be `atom/foo.xml` and so on. - * `atom_legacy_entry_id` (default: `false`): - Before `0.14.0` blogc-make was generating "broken" entry IDs in the atom feeds. - This behavior was fixed in version `0.14.0` and current users that don't want - to have their old posts re-shared due to the change of IDs should set this to - `true`, to keep using the old format. + * `atom_template` (default: internal template) + The template file that should be used when building Atom feeds. This file + is relative to `template_dir`. If not provided, an internal default template + will be used instead. * `content_dir` (default: `content`): The directory that stores the source files. This directory is relative diff --git a/src/blogc-make/ctx.c b/src/blogc-make/ctx.c index 909a526..8f47e37 100644 --- a/src/blogc-make/ctx.c +++ b/src/blogc-make/ctx.c @@ -177,15 +177,29 @@ bm_ctx_new(bm_ctx_t *base, const char *settings_file, const char *argv0, return NULL; bm_settings_t *settings = bm_settings_parse(content, content_len, err); - if (*err != NULL) { + if (settings == NULL || *err != NULL) { free(content); return NULL; } free(content); - char *atom_template = bm_atom_deploy(settings, err); - if (*err != NULL) { - return NULL; + const char *template_dir = bc_trie_lookup(settings->settings, "template_dir"); + if (template_dir == NULL) + template_dir = ""; + + char *atom_template = NULL; + bool atom_template_tmp = false; + const char *atom_template_conf = bc_trie_lookup(settings->settings, + "atom_template"); + if (atom_template_conf != NULL) { + atom_template = bc_strdup_printf("%s/%s", template_dir, atom_template_conf); + } + else { + atom_template = bm_atom_deploy(settings, err); + atom_template_tmp = true; + if (*err != NULL) { + return NULL; + } } bm_ctx_t *rv = NULL; @@ -221,13 +235,12 @@ bm_ctx_new(bm_ctx_t *base, const char *settings_file, const char *argv0, // can't return null and set error after this! - const char *template_dir = bm_ctx_settings_lookup(rv, "template_dir"); - char *main_template = bc_strdup_printf("%s/%s", template_dir, bm_ctx_settings_lookup(rv, "main_template")); rv->main_template_fctx = bm_filectx_new(rv, main_template, NULL, NULL); free(main_template); + rv->atom_template_tmp = atom_template_tmp; rv->atom_template_fctx = bm_filectx_new(rv, atom_template, NULL, NULL); free(atom_template); @@ -325,7 +338,9 @@ bm_ctx_free_internal(bm_ctx_t *ctx) free(ctx->output_dir); ctx->output_dir = NULL; - bm_atom_destroy(ctx->atom_template_fctx->path); + if (ctx->atom_template_tmp) + bm_atom_destroy(ctx->atom_template_fctx->path); + ctx->atom_template_tmp = false; bm_filectx_free(ctx->main_template_fctx); ctx->main_template_fctx = NULL; diff --git a/src/blogc-make/ctx.h b/src/blogc-make/ctx.h index df512e1..8d82816 100644 --- a/src/blogc-make/ctx.h +++ b/src/blogc-make/ctx.h @@ -49,6 +49,7 @@ typedef struct { bool dev; bool verbose; + bool atom_template_tmp; bm_settings_t *settings; diff --git a/src/blogc-make/settings.c b/src/blogc-make/settings.c index 719afe1..e103e42 100644 --- a/src/blogc-make/settings.c +++ b/src/blogc-make/settings.c @@ -24,6 +24,7 @@ static const struct default_settings_map { // source {"content_dir", "content"}, {"template_dir", "templates"}, + {"atom_template", NULL}, // default: atom.c {"main_template", "main.tmpl"}, {"source_ext", ".txt"}, diff --git a/tests/blogc-make/check_blogc_make.sh.in b/tests/blogc-make/check_blogc_make.sh.in index 2a82b2d..35a7c41 100755 --- a/tests/blogc-make/check_blogc_make.sh.in +++ b/tests/blogc-make/check_blogc_make.sh.in @@ -436,6 +436,257 @@ diff -uN "${TEMP}/proj/_build/post/post11/index.html" "${TEMP}/expected-post-pos rm -rf "${TEMP}/proj/_build" +### default settings with some posts, custom atom template + +cat > "${TEMP}/proj/blogcfile" < "${TEMP}/proj/templates/atom.tmpl" < + + {{ SITE_TITLE }}{% ifdef FILTER_TAG %} - {{ FILTER_TAG }}{% endif %} + {{ BASE_URL }}/atom/{% ifdef FILTER_TAG %}{{ FILTER_TAG }}/{% endif %} + {{ DATE_FIRST_FORMATTED }} + + + + {{ AUTHOR_NAME }} + {{ AUTHOR_EMAIL }} + + {{ SITE_TAGLINE }} + {% block listing %} + + {{ TITLE }} + {{ BASE_URL }}/post/{{ FILENAME }}/ + {{ DATE_FORMATTED }} + {{ DATE_FORMATTED }} + + + {{ AUTHOR_NAME }} + {{ AUTHOR_EMAIL }} + + + + {% endblock %} + +EOF + +${TESTS_ENVIRONMENT} @abs_top_builddir@/blogc-make -f "${TEMP}/proj/blogcfile" 2>&1 | tee "${TEMP}/output.txt" +grep "_build/index\\.html" "${TEMP}/output.txt" +grep "_build/atom\\.xml" "${TEMP}/output.txt" +grep "_build/post/post01/index\\.html" "${TEMP}/output.txt" +grep "_build/post/post02/index\\.html" "${TEMP}/output.txt" +grep "_build/post/post03/index\\.html" "${TEMP}/output.txt" +grep "_build/post/post04/index\\.html" "${TEMP}/output.txt" +grep "_build/post/post05/index\\.html" "${TEMP}/output.txt" +grep "_build/post/post06/index\\.html" "${TEMP}/output.txt" +grep "_build/post/post07/index\\.html" "${TEMP}/output.txt" +grep "_build/post/post08/index\\.html" "${TEMP}/output.txt" +grep "_build/post/post09/index\\.html" "${TEMP}/output.txt" +grep "_build/post/post10/index\\.html" "${TEMP}/output.txt" +grep "_build/post/post11/index\\.html" "${TEMP}/output.txt" + +rm "${TEMP}/output.txt" + +cat > "${TEMP}/expected-atom.xml" < + + Lol's Website + /atom/ + 2016-09-11T00:00:00Z + + + + Lol + author@example.com + + WAT?! + + + Post 11 + /post/post11/ + 2016-09-11T00:00:00Z + 2016-09-11T00:00:00Z + + + Lol + author@example.com + + This is Post 11.

+]]>
+
+ + + Post 10 + /post/post10/ + 2016-09-10T00:00:00Z + 2016-09-10T00:00:00Z + + + Lol + author@example.com + + This is Post 10.

+]]>
+
+ + + Post 09 + /post/post09/ + 2016-09-09T00:00:00Z + 2016-09-09T00:00:00Z + + + Lol + author@example.com + + This is Post 09.

+]]>
+
+ + + Post 08 + /post/post08/ + 2016-09-08T00:00:00Z + 2016-09-08T00:00:00Z + + + Lol + author@example.com + + This is Post 08.

+]]>
+
+ + + Post 07 + /post/post07/ + 2016-09-07T00:00:00Z + 2016-09-07T00:00:00Z + + + Lol + author@example.com + + This is Post 07.

+]]>
+
+ + + Post 06 + /post/post06/ + 2016-09-06T00:00:00Z + 2016-09-06T00:00:00Z + + + Lol + author@example.com + + This is Post 06.

+]]>
+
+ + + Post 05 + /post/post05/ + 2016-09-05T00:00:00Z + 2016-09-05T00:00:00Z + + + Lol + author@example.com + + This is Post 05.

+]]>
+
+ + + Post 04 + /post/post04/ + 2016-09-04T00:00:00Z + 2016-09-04T00:00:00Z + + + Lol + author@example.com + + This is Post 04.

+]]>
+
+ + + Post 03 + /post/post03/ + 2016-09-03T00:00:00Z + 2016-09-03T00:00:00Z + + + Lol + author@example.com + + This is Post 03.

+]]>
+
+ + + Post 02 + /post/post02/ + 2016-09-02T00:00:00Z + 2016-09-02T00:00:00Z + + + Lol + author@example.com + + This is Post 02.

+]]>
+
+ + + Post 01 + /post/post01/ + 2016-09-01T00:00:00Z + 2016-09-01T00:00:00Z + + + Lol + author@example.com + + This is Post 01.

+]]>
+
+ +
+EOF +diff -uN "${TEMP}/proj/_build/atom.xml" "${TEMP}/expected-atom.xml" + +rm -rf "${TEMP}/proj/_build" + + ### default settings with some posts, atom posts per page 0 cat > "${TEMP}/proj/blogcfile" <