From fb5a52884dd17d17bab47de7f53c17c05ced6e1b Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sat, 4 Jun 2011 17:30:12 +0200 Subject: Introduce conditional system This is very basic scripting support - simple value retrieval and block conditionals. Defines could be either static from theme setup or programatically added during page generation. --- src/replace-table.c | 46 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 6 deletions(-) (limited to 'src/replace-table.c') diff --git a/src/replace-table.c b/src/replace-table.c index 95d5e30..9cd02ea 100644 --- a/src/replace-table.c +++ b/src/replace-table.c @@ -37,6 +37,26 @@ replace_table_new () return (ReplaceTable *) g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); } +/* + * replace_table_new_from_defines: creates new replace table object and fills it with defines from the hash table + * + */ +ReplaceTable * +replace_table_new_from_defines (GHashTable *defines) +{ + GHashTable *table; + GHashTableIter iter; + gchar *key, *value; + + table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + g_hash_table_iter_init (&iter, defines); + while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &value)) + g_hash_table_insert (table, g_strdup_printf ("value(%s)", key), g_strdup (value)); + + return table; +} + void replace_table_free (ReplaceTable *table) { @@ -182,8 +202,9 @@ gchar * get_next_token (const gchar *s, gchar **start, gchar **end, gboolean *tag_parameter) { gchar *dollar; - gchar *end_brace; + gchar *end_paren; gchar *b; + int num_paren; *start = NULL; *end = NULL; @@ -193,10 +214,23 @@ get_next_token (const gchar *s, gchar **start, gchar **end, gboolean *tag_parame dollar = strstr (s, "$("); if (dollar == NULL) return NULL; - end_brace = strchr (dollar + 2, ')'); - if (end_brace == NULL) + end_paren = strchr (dollar + 2, ')'); + if (end_paren == NULL) return NULL; + /* Count opening parentheses and include nested parentheses in the token */ + num_paren = 0; + for (b = dollar; b < end_paren; b++) + if (*b == '(') + num_paren++; + while (num_paren > 1) { + end_paren = strchr (end_paren + 1, ')'); + if (end_paren == NULL) + return NULL; + num_paren--; + } + g_assert (num_paren <= 1); /* something really bad happened */ + /* Go back and try to find placeholder beginning */ for (b = dollar - 1; b >= s + 3; b--) { if (*b == '-' && *(b-1) == '-' && *(b-2) == '!' && *(b-3) == '<') { @@ -212,7 +246,7 @@ get_next_token (const gchar *s, gchar **start, gchar **end, gboolean *tag_parame *start = dollar; /* Go forth and try to find placeholder end */ - for (b = end_brace + 1; b <= end_brace + strlen (end_brace) - 3; b++) { + for (b = end_paren + 1; b <= end_paren + strlen (end_paren) - 3; b++) { if (*b == '-' && *(b+1) == '-' && *(b+2) == '>') { *end = b + 2; break; @@ -221,8 +255,8 @@ get_next_token (const gchar *s, gchar **start, gchar **end, gboolean *tag_parame break; } if (*end == NULL) - *end = end_brace; + *end = end_paren; - return g_strndup (dollar + 2, end_brace - dollar - 2); + return g_strndup (dollar + 2, end_paren - dollar - 2); } -- cgit v1.2.3