diff options
| author | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2011-06-04 17:30:12 +0200 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2011-06-04 17:30:12 +0200 |
| commit | fb5a52884dd17d17bab47de7f53c17c05ced6e1b (patch) | |
| tree | fdb3873d295b615bfb1689c54fb76e3abb4e273f /src/replace-table.c | |
| parent | 960c477148cf832f79e89a4cdf9f3ce3389c7b06 (diff) | |
| download | cataract-fb5a52884dd17d17bab47de7f53c17c05ced6e1b.tar.xz | |
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.
Diffstat (limited to 'src/replace-table.c')
| -rw-r--r-- | src/replace-table.c | 46 |
1 files changed, 40 insertions, 6 deletions
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); } |
