aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael G. Martins <rafael@rafaelmartins.eng.br>2015-10-28 01:28:32 -0200
committerRafael G. Martins <rafael@rafaelmartins.eng.br>2015-10-28 01:28:32 -0200
commit9bfeada5b27a07d1b469183250a1495c1a2751f7 (patch)
tree7612c31f30374b411c90aa8cec82b5c3edb3a384
parenta5128b3c739a79d2bf57de25023603387dcf9ce2 (diff)
downloadblogc-9bfeada5b27a07d1b469183250a1495c1a2751f7.tar.gz
blogc-9bfeada5b27a07d1b469183250a1495c1a2751f7.tar.bz2
blogc-9bfeada5b27a07d1b469183250a1495c1a2751f7.zip
renderer: improved support for comparision between vars
-rw-r--r--src/renderer.c114
-rw-r--r--src/renderer.h1
-rw-r--r--tests/check_renderer.c54
3 files changed, 110 insertions, 59 deletions
diff --git a/src/renderer.c b/src/renderer.c
index 167145d..3061c43 100644
--- a/src/renderer.c
+++ b/src/renderer.c
@@ -10,6 +10,7 @@
#include <config.h>
#endif /* HAVE_CONFIG_H */
+#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include "utils/utils.h"
@@ -57,6 +58,37 @@ blogc_format_date(const char *date, b_trie_t *global, b_trie_t *local)
char*
+blogc_format_variable(const char *name, b_trie_t *global, b_trie_t *local)
+{
+ char *var = NULL;
+ bool must_format = false;
+ if (b_str_ends_with(name, "_FORMATTED")) {
+ var = b_strndup(name, strlen(name) - 10);
+ must_format = true;
+ }
+ if (var == NULL)
+ var = b_strdup(name);
+
+ const char *value = blogc_get_variable(var, global, local);
+ free(var);
+
+ if (value == NULL)
+ return NULL;
+
+ char *rv = NULL;
+ if (must_format) {
+ if (b_str_starts_with(name, "DATE_")) {
+ rv = blogc_format_date(value, global, local);
+ }
+ }
+
+ if (rv == NULL)
+ return b_strdup(value);
+ return rv;
+}
+
+
+char*
blogc_render(b_slist_t *tmpl, b_slist_t *sources, b_trie_t *config, bool listing)
{
if (tmpl == NULL)
@@ -68,9 +100,7 @@ blogc_render(b_slist_t *tmpl, b_slist_t *sources, b_trie_t *config, bool listing
b_string_t *str = b_string_new();
b_trie_t *tmp_source = NULL;
- const char *config_value = NULL;
- const char *config_var = NULL;
- char *config_value2 = NULL;
+ char *config_value = NULL;
char *defined = NULL;
unsigned int if_count = 0;
@@ -144,30 +174,13 @@ blogc_render(b_slist_t *tmpl, b_slist_t *sources, b_trie_t *config, bool listing
case BLOGC_TEMPLATE_VARIABLE_STMT:
if (stmt->value != NULL) {
- config_var = NULL;
- if (0 == strcmp(stmt->value, "DATE_FORMATTED"))
- config_var = "DATE";
- else if (0 == strcmp(stmt->value, "DATE_FIRST_FORMATTED"))
- config_var = "DATE_FIRST";
- else if (0 == strcmp(stmt->value, "DATE_LAST_FORMATTED"))
- config_var = "DATE_LAST";
- if (config_var != NULL) {
- config_value2 = blogc_format_date(
- blogc_get_variable(config_var, config,
- inside_block ? tmp_source : NULL),
- config, inside_block ? tmp_source : NULL);
- if (config_value2 != NULL) {
- b_string_append(str, config_value2);
- free(config_value2);
- config_value2 = NULL;
- break;
- }
- }
- else {
- config_value = blogc_get_variable(stmt->value, config,
- inside_block ? tmp_source : NULL);
- if (config_value != NULL)
- b_string_append(str, config_value);
+ config_value = blogc_format_variable(stmt->value,
+ config, inside_block ? tmp_source : NULL);
+ if (config_value != NULL) {
+ b_string_append(str, config_value);
+ free(config_value);
+ config_value = NULL;
+ break;
}
}
break;
@@ -191,44 +204,27 @@ blogc_render(b_slist_t *tmpl, b_slist_t *sources, b_trie_t *config, bool listing
case BLOGC_TEMPLATE_IF_STMT:
case BLOGC_TEMPLATE_IFDEF_STMT:
defined = NULL;
- if (stmt->value != NULL) {
- config_var = NULL;
- if (0 == strcmp(stmt->value, "DATE_FORMATTED"))
- config_var = "DATE";
- else if (0 == strcmp(stmt->value, "DATE_FIRST_FORMATTED"))
- config_var = "DATE_FIRST";
- else if (0 == strcmp(stmt->value, "DATE_LAST_FORMATTED"))
- config_var = "DATE_LAST";
- if (config_var != NULL) {
- config_value2 = blogc_format_date(
- blogc_get_variable(config_var, config,
- inside_block ? tmp_source : NULL),
- config, inside_block ? tmp_source : NULL);
- if (config_value2 != NULL) {
- defined = config_value2;
- config_value2 = NULL;
- }
- }
- else
- defined = b_strdup(blogc_get_variable(stmt->value,
- config, inside_block ? tmp_source : NULL));
- }
+ if (stmt->value != NULL)
+ defined = blogc_format_variable(stmt->value, config,
+ inside_block ? tmp_source : NULL);
evaluate = false;
if (stmt->op != 0) {
// Strings that start with a '"' are actually strings, the
// others are meant to be looked up as a second variable
// check.
char *defined2 = NULL;
- if (stmt->value2[0] != '"') {
- defined2 =
- b_strdup(blogc_get_variable(stmt->value2,
- config,
- inside_block ? tmp_source
- : NULL)
- );
- } else {
- defined2 = b_strndup(stmt->value2 + 1,
- strlen(stmt->value2) - 2);
+ if (stmt->value2 != NULL) {
+ if ((strlen(stmt->value2) >= 2) &&
+ (stmt->value2[0] == '"') &&
+ (stmt->value2[strlen(stmt->value2) - 1] == '"'))
+ {
+ defined2 = b_strndup(stmt->value2 + 1,
+ strlen(stmt->value2) - 2);
+ }
+ else {
+ defined2 = blogc_format_variable(stmt->value2,
+ config, inside_block ? tmp_source : NULL);
+ }
}
if (defined != NULL && defined2 != NULL) {
diff --git a/src/renderer.h b/src/renderer.h
index ebe0aee..e5cff6e 100644
--- a/src/renderer.h
+++ b/src/renderer.h
@@ -14,6 +14,7 @@
const char* blogc_get_variable(const char *name, b_trie_t *global, b_trie_t *local);
char* blogc_format_date(const char *date, b_trie_t *global, b_trie_t *local);
+char* blogc_format_variable(const char *name, b_trie_t *global, b_trie_t *local);
char* blogc_render(b_slist_t *tmpl, b_slist_t *sources, b_trie_t *config,
bool listing);
diff --git a/tests/check_renderer.c b/tests/check_renderer.c
index fbe38de..cb8f8f1 100644
--- a/tests/check_renderer.c
+++ b/tests/check_renderer.c
@@ -28,6 +28,7 @@ create_sources(unsigned int count)
const char *s[] = {
"BOLA: asd\n"
"GUDA: zxc\n"
+ "GUDA2: zxc\n"
"DATE: 2015-01-02 03:04:05\n"
"DATE_FORMAT: %R\n"
"-----\n"
@@ -68,6 +69,7 @@ test_render_entry(void **state)
"{% ifdef CHUNDA %}{{ CHUNDA }}{% endif %}\n"
"{% endblock %}\n"
"{% block listing %}lol{% endblock %}\n"
+ "{% if GUDA == GUDA2 %}gudabola{% endif %}\n"
"{% if GUDA == \"zxc\" %}LOL{% endif %}\n"
"{% if GUDA != \"bola\" %}HEHE{% endif %}\n"
"{% if GUDA < \"zxd\" %}LOL2{% endif %}\n"
@@ -90,6 +92,7 @@ test_render_entry(void **state)
"\n"
"\n"
"\n"
+ "gudabola\n"
"LOL\n"
"HEHE\n"
"LOL2\n"
@@ -302,6 +305,7 @@ test_render_if_eq(void **state)
{
const char *str =
"{% block entry %}\n"
+ "{% if GUDA == GUDA2 %}gudabola{% endif %}\n"
"{% if GUDA == \"zxc\" %}guda\n"
"{% ifdef BOLA %}bola\n"
"{% if GUDA > \"zxc\" %}asd\n"
@@ -318,6 +322,7 @@ test_render_if_eq(void **state)
char *out = blogc_render(l, s, NULL, false);
assert_string_equal(out,
"\n"
+ "gudabola\n"
"guda\n"
"bola\n"
"\n"
@@ -335,6 +340,7 @@ test_render_if_neq(void **state)
{
const char *str =
"{% block entry %}\n"
+ "{% if GUDA != BOLA %}gudabola{% endif %}\n"
"{% if GUDA != \"zxa\" %}guda\n"
"{% ifdef BOLA %}bola\n"
"{% if GUDA > \"zxc\" %}asd\n"
@@ -351,6 +357,7 @@ test_render_if_neq(void **state)
char *out = blogc_render(l, s, NULL, false);
assert_string_equal(out,
"\n"
+ "gudabola\n"
"guda\n"
"bola\n"
"\n"
@@ -368,6 +375,7 @@ test_render_if_lt(void **state)
{
const char *str =
"{% block entry %}\n"
+ "{% if BOLA < GUDA %}gudabola{% endif %}\n"
"{% if GUDA < \"zxe\" %}guda\n"
"{% ifdef BOLA %}bola\n"
"{% if GUDA > \"zxc\" %}asd\n"
@@ -384,6 +392,7 @@ test_render_if_lt(void **state)
char *out = blogc_render(l, s, NULL, false);
assert_string_equal(out,
"\n"
+ "gudabola\n"
"guda\n"
"bola\n"
"\n"
@@ -401,6 +410,7 @@ test_render_if_gt(void **state)
{
const char *str =
"{% block entry %}\n"
+ "{% if GUDA > BOLA %}gudabola{% endif %}\n"
"{% if GUDA > \"zxa\" %}guda\n"
"{% ifdef BOLA %}bola\n"
"{% if GUDA > \"zxc\" %}asd\n"
@@ -417,6 +427,7 @@ test_render_if_gt(void **state)
char *out = blogc_render(l, s, NULL, false);
assert_string_equal(out,
"\n"
+ "gudabola\n"
"guda\n"
"bola\n"
"\n"
@@ -434,6 +445,7 @@ test_render_if_lt_eq(void **state)
{
const char *str =
"{% block entry %}\n"
+ "{% if BOLA <= GUDA %}gudabola{% endif %}\n"
"{% if GUDA <= \"zxc\" %}guda\n"
"{% if GUDA <= \"zxe\" %}guda2\n"
"{% ifdef BOLA %}bola\n"
@@ -452,6 +464,7 @@ test_render_if_lt_eq(void **state)
char *out = blogc_render(l, s, NULL, false);
assert_string_equal(out,
"\n"
+ "gudabola\n"
"guda\n"
"guda2\n"
"bola\n"
@@ -471,6 +484,7 @@ test_render_if_gt_eq(void **state)
{
const char *str =
"{% block entry %}\n"
+ "{% if GUDA >= BOLA %}gudabola{% endif %}\n"
"{% if GUDA >= \"zxc\" %}guda\n"
"{% if GUDA >= \"zxa\" %}guda2\n"
"{% ifdef BOLA %}bola\n"
@@ -489,6 +503,7 @@ test_render_if_gt_eq(void **state)
char *out = blogc_render(l, s, NULL, false);
assert_string_equal(out,
"\n"
+ "gudabola\n"
"guda\n"
"guda2\n"
"bola\n"
@@ -708,6 +723,43 @@ test_format_date_without_date(void **state)
}
+static void
+test_format_variable(void **state)
+{
+ b_trie_t *g = b_trie_new(free);
+ b_trie_insert(g, "NAME", b_strdup("bola"));
+ b_trie_insert(g, "TITLE", b_strdup("bola2"));
+ b_trie_t *l = b_trie_new(free);
+ b_trie_insert(l, "NAME", b_strdup("chunda"));
+ b_trie_insert(l, "TITLE", b_strdup("chunda2"));
+ char *tmp = blogc_format_variable("NAME", g, l);
+ assert_string_equal(tmp, "chunda");
+ free(tmp);
+ tmp = blogc_format_variable("TITLE", g, l);
+ assert_string_equal(tmp, "chunda2");
+ free(tmp);
+ assert_null(blogc_format_variable("BOLA", g, l));
+ b_trie_free(g);
+ b_trie_free(l);
+}
+
+
+static void
+test_format_variable_with_date(void **state)
+{
+ b_trie_t *g = b_trie_new(free);
+ b_trie_insert(g, "DATE", b_strdup("2010-11-12 13:14:15"));
+ b_trie_insert(g, "DATE_FORMAT", b_strdup("%R"));
+ b_trie_t *l = b_trie_new(free);
+ b_trie_insert(l, "DATE", b_strdup("2011-12-13 14:15:16"));
+ char *tmp = blogc_format_variable("DATE_FORMATTED", g, l);
+ assert_string_equal(tmp, "14:15");
+ free(tmp);
+ b_trie_free(g);
+ b_trie_free(l);
+}
+
+
int
main(void)
{
@@ -736,6 +788,8 @@ main(void)
unit_test(test_format_date_with_global_format),
unit_test(test_format_date_without_format),
unit_test(test_format_date_without_date),
+ unit_test(test_format_variable),
+ unit_test(test_format_variable_with_date),
};
return run_tests(tests);
}