From 582cbc6cf67919ec189098817ab1e4541c8e761d Mon Sep 17 00:00:00 2001 From: "Rafael G. Martins" Date: Tue, 28 Apr 2015 02:31:40 -0300 Subject: implemented datetime parsing/formatting --- src/renderer.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 18 deletions(-) (limited to 'src/renderer.c') diff --git a/src/renderer.c b/src/renderer.c index 905c42f..ac269b8 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -10,13 +10,65 @@ #include #endif /* HAVE_CONFIG_H */ +#ifdef HAVE_TIME_H +#include +#endif /* HAVE_TIME_H */ + +#include #include #include "utils/utils.h" +#include "loader.h" #include "source-parser.h" #include "template-parser.h" #include "renderer.h" +const char* +blogc_get_variable(const char *name, b_trie_t *global, b_trie_t *local) +{ + const char *rv = NULL; + if (local != NULL) { + rv = b_trie_lookup(local, name); + if (rv != NULL) + return rv; + } + if (global != NULL) + rv = b_trie_lookup(global, name); + return rv; +} + + +char* +blogc_format_date(b_trie_t *global, b_trie_t *local) +{ + const char *date = blogc_get_variable("DATE", global, local); + const char *date_format = blogc_get_variable("DATE_FORMAT", global, local); + if (date == NULL) + return NULL; + if (date_format == NULL) + return b_strdup(date); +#ifdef HAVE_TIME_H + struct tm tm; + memset(&tm, 0, sizeof(struct tm)); + if (NULL == strptime(date, "%Y-%m-%d %H:%M:%S", &tm)) { + fprintf(stderr, "blogc: warning: Failed to parse DATE variable: %s\n", + date); + return b_strdup(date); + } + char tmp[1024]; + if (0 == strftime(tmp, sizeof(tmp), date_format, &tm)) { + fprintf(stderr, "blogc: warning: Failed to format DATE variable, " + "FORMAT is too long: %s\n", date_format); + return b_strdup(date); + } + return b_strdup(tmp); +#else + fprintf(stderr, "blogc: warning: Can't pre-process DATE variable.\n"); + return NULL; +#endif +} + + char* blogc_render(b_slist_t *tmpl, b_slist_t *sources, b_trie_t *config, bool listing) { @@ -29,7 +81,8 @@ 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; - char *config_value = NULL; + const char *config_value = NULL; + char *config_value2 = NULL; unsigned int if_count = 0; unsigned int if_skip = 0; @@ -88,23 +141,19 @@ 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) { - - // try local config first - if (tmp_source != NULL) { - config_value = b_trie_lookup(tmp_source, stmt->value); - if (config_value != NULL) { - b_string_append(str, config_value); + if (0 == strcmp(stmt->value, "DATE_FORMATTED")) { + config_value2 = blogc_format_date(config, tmp_source); + if (config_value2 != NULL) { + b_string_append(str, config_value2); + free(config_value2); + config_value2 = NULL; break; } } - - // if not found, try global config - if (config != NULL) { - config_value = b_trie_lookup(config, stmt->value); - if (config_value != NULL) { + else { + config_value = blogc_get_variable(stmt->value, config, tmp_source); + if (config_value != NULL) b_string_append(str, config_value); - break; - } } } break; @@ -127,10 +176,16 @@ blogc_render(b_slist_t *tmpl, b_slist_t *sources, b_trie_t *config, bool listing case BLOGC_TEMPLATE_IF_STMT: defined = false; if (stmt->value != NULL) { - if (tmp_source != NULL && b_trie_lookup(tmp_source, stmt->value) != NULL) - defined = true; - if (config != NULL && b_trie_lookup(config, stmt->value) != NULL) - defined = true; + if (0 == strcmp(stmt->value, "DATE_FORMATTED")) { + config_value2 = blogc_format_date(config, tmp_source); + if (config_value2 != NULL) { + defined = true; + free(config_value2); + config_value2 = NULL; + } + } + else + defined = blogc_get_variable(stmt->value, config, tmp_source) != NULL; } if ((!if_not && !defined) || (if_not && defined)) { if_skip = if_count; -- cgit v1.2.3-18-g5258