From 2793a94367e7b163ff3738619a2a764f1c6645b7 Mon Sep 17 00:00:00 2001 From: "Rafael G. Martins" Date: Sat, 27 Apr 2019 02:56:52 +0200 Subject: make: support posts sorting --- man/blogcfile.5.ronn | 5 + src/blogc-make/rules.c | 12 +- src/blogc-make/settings.c | 1 + tests/blogc-make/check_blogc_make.sh.in | 220 ++++++++++++++++++++++++++++++++ 4 files changed, 235 insertions(+), 3 deletions(-) diff --git a/man/blogcfile.5.ronn b/man/blogcfile.5.ronn index 8f50e8c..fd77e1c 100644 --- a/man/blogcfile.5.ronn +++ b/man/blogcfile.5.ronn @@ -115,6 +115,11 @@ however these rules can be customized with the following settings, from the are included. If `0`, no post listing pages are generated. Also, if negative or `0`, the `pagination` build rule is disabled. + * `posts_sort` (default: `false`): + If true, blogc(1) will sort the posts by date, despite the order of the posts + in the `[posts]` section. It is compatible with `html_order` and `atom_order` + settings. + * `source_ext` (default: `.txt`): The extension of the source files. diff --git a/src/blogc-make/rules.c b/src/blogc-make/rules.c index f1a0be9..96cf51d 100644 --- a/src/blogc-make/rules.c +++ b/src/blogc-make/rules.c @@ -31,10 +31,16 @@ posts_ordering(bm_ctx_t *ctx, bc_trie_t *variables, const char *variable) return; // something is wrong, let's not add any variable const char *value = bm_ctx_settings_lookup_str(ctx, variable); - if (value != NULL && ((0 == strcmp(value, "ASC")) || (0 == strcmp(value, "asc")))) - return; // user explicitly asked for ASC + bool asc = 0 == strcasecmp(value, "asc"); + bool sort = bc_str_to_bool(bm_ctx_settings_lookup(ctx, "posts_sort")); - bc_trie_insert(variables, "FILTER_REVERSE", bc_strdup("1")); + if (sort) { + bc_trie_insert(variables, "FILTER_SORT", bc_strdup("1")); + } + + if ((sort && asc) || (!sort && !asc)) { + bc_trie_insert(variables, "FILTER_REVERSE", bc_strdup("1")); + } } diff --git a/src/blogc-make/settings.c b/src/blogc-make/settings.c index 05e610a..be976e3 100644 --- a/src/blogc-make/settings.c +++ b/src/blogc-make/settings.c @@ -28,6 +28,7 @@ static const struct default_settings_map { {"main_template", "main.tmpl"}, {"source_ext", ".txt"}, {"listing_entry", NULL}, + {"posts_sort", NULL}, // pagination {"pagination_prefix", "page"}, diff --git a/tests/blogc-make/check_blogc_make.sh.in b/tests/blogc-make/check_blogc_make.sh.in index 14223d0..36dfceb 100755 --- a/tests/blogc-make/check_blogc_make.sh.in +++ b/tests/blogc-make/check_blogc_make.sh.in @@ -755,6 +755,226 @@ diff -uN "${TEMP}/proj/_build/post/post11/index.html" "${TEMP}/expected-post-pos rm -rf "${TEMP}/proj/_build" +### default settings with some posts, order asc, posts_sort + +cat > "${TEMP}/proj/blogcfile" <&1 | tee "${TEMP}/output.txt" +grep "_build/index\\.html" "${TEMP}/output.txt" +grep "_build/atom\\.xml" "${TEMP}/output.txt" +grep "_build/page/1/index\\.html" "${TEMP}/output.txt" +grep "_build/post/foo/index\\.html" "${TEMP}/output.txt" +grep "_build/post/bar/index\\.html" "${TEMP}/output.txt" + +rm "${TEMP}/output.txt" + +cat > "${TEMP}/expected-index.html" < "${TEMP}/expected-atom.xml" < + + Lol's Website + http://example.org/atom.xml + 2016-09-01T00:00:00Z + + + + Lol + author@example.com + + WAT?! + + + Bar + http://example.org/post/bar/index.html + 2016-09-01T00:00:00Z + 2016-09-01T00:00:00Z + + + Lol + author@example.com + + This is bar.

+]]>
+
+ + + Foo + http://example.org/post/foo/index.html + 2016-10-01T00:00:00Z + 2016-10-01T00:00:00Z + + + Lol + author@example.com + + This is foo.

+]]>
+
+ +
+EOF +diff -uN "${TEMP}/proj/_build/atom.xml" "${TEMP}/expected-atom.xml" + +cat > "${TEMP}/expected-post-foo.html" <This is foo.

+ + +EOF +diff -uN "${TEMP}/proj/_build/post/foo/index.html" "${TEMP}/expected-post-foo.html" + +cat > "${TEMP}/expected-post-bar.html" <This is bar.

+ + +EOF +diff -uN "${TEMP}/proj/_build/post/bar/index.html" "${TEMP}/expected-post-bar.html" + +rm -rf "${TEMP}/proj/_build" + + +### default settings with some posts, order desc, posts_sort + +cat > "${TEMP}/proj/blogcfile" <&1 | tee "${TEMP}/output.txt" +grep "_build/index\\.html" "${TEMP}/output.txt" +grep "_build/atom\\.xml" "${TEMP}/output.txt" +grep "_build/page/1/index\\.html" "${TEMP}/output.txt" +grep "_build/post/foo/index\\.html" "${TEMP}/output.txt" +grep "_build/post/bar/index\\.html" "${TEMP}/output.txt" + +rm "${TEMP}/output.txt" + +cat > "${TEMP}/expected-index.html" < "${TEMP}/expected-atom.xml" < + + Lol's Website + http://example.org/atom.xml + 2016-10-01T00:00:00Z + + + + Lol + author@example.com + + WAT?! + + + Foo + http://example.org/post/foo/index.html + 2016-10-01T00:00:00Z + 2016-10-01T00:00:00Z + + + Lol + author@example.com + + This is foo.

+]]>
+
+ + + Bar + http://example.org/post/bar/index.html + 2016-09-01T00:00:00Z + 2016-09-01T00:00:00Z + + + Lol + author@example.com + + This is bar.

+]]>
+
+ +
+EOF +diff -uN "${TEMP}/proj/_build/atom.xml" "${TEMP}/expected-atom.xml" + +cat > "${TEMP}/expected-post-foo.html" <This is foo.

+ + +EOF +diff -uN "${TEMP}/proj/_build/post/foo/index.html" "${TEMP}/expected-post-foo.html" + +cat > "${TEMP}/expected-post-bar.html" <This is bar.

+ + +EOF +diff -uN "${TEMP}/proj/_build/post/bar/index.html" "${TEMP}/expected-post-bar.html" + +rm -rf "${TEMP}/proj/_build" + + ### default settings with some posts, order asc, listing_entry cat > "${TEMP}/proj/content/hue.txt" <