From 3b9ffd28da4d2af023e6a77ab1d6ee683f90ef6b Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Sun, 11 Sep 2011 01:50:06 +0000 Subject: New tag %ss() which lets you get a substring of another tag. %ss(start, length, tag) - i.e %ss(0,1,%TL) will get the first letter of the current lines text. use - for the length to get the rest of the tag (e.g %ss(1,-,%TL) will get everything after the first letter). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30500 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/skin_engine/skin_parser.c | 21 +++++++++++++++++++++ apps/gui/skin_engine/skin_tokens.c | 29 ++++++++++++++++++++++++++++- apps/gui/skin_engine/wps_internals.h | 6 ++++++ 3 files changed, 55 insertions(+), 1 deletion(-) (limited to 'apps/gui') diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index a866101c1c..0db19645bc 100644 --- a/apps/gui/skin_engine/skin_parser.c +++ b/apps/gui/skin_engine/skin_parser.c @@ -720,6 +720,24 @@ static int parse_timeout_tag(struct skin_element *element, return 0; } +static int parse_substring_tag(struct skin_element* element, + struct wps_token *token, + struct wps_data *wps_data) +{ + (void)wps_data; + struct substring *ss = (struct substring*)skin_buffer_alloc(sizeof(struct substring)); + if (!ss) + return 1; + ss->start = element->params[0].data.number; + if (element->params[1].type == DEFAULT) + ss->length = -1; + else + ss->length = element->params[1].data.number; + ss->token = element->params[2].data.code->data; + token->value.data = ss; + return 0; +} + static int parse_progressbar_tag(struct skin_element* element, struct wps_token *token, struct wps_data *wps_data) @@ -1788,6 +1806,9 @@ static int skin_element_callback(struct skin_element* element, void* data) case SKIN_TOKEN_LOGICAL_IF: function = parse_logical_if; break; + case SKIN_TOKEN_SUBSTRING: + function = parse_substring_tag; + break; case SKIN_TOKEN_PROGRESSBAR: case SKIN_TOKEN_VOLUME: case SKIN_TOKEN_BATTERY_PERCENT: diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c index ed72241d34..371db46017 100644 --- a/apps/gui/skin_engine/skin_tokens.c +++ b/apps/gui/skin_engine/skin_tokens.c @@ -868,7 +868,34 @@ const char *get_token_value(struct gui_wps *gwps, struct logical_if *lif = token->value.data; return get_lif_token_value(gwps, lif, offset, buf, buf_size); } - break; + break; + case SKIN_TOKEN_SUBSTRING: + { + struct substring *ss = token->value.data; + const char *token_val = get_token_value(gwps, ss->token, offset, + buf, buf_size, intval); + int ret_len = ss->length; + if (token_val) + { + int len = strlen(token_val); + if (len < ss->start) + return NULL; + if (ret_len < 0) + ret_len = strlen(token_val) - ss->start; + if (token_val != buf) + { + memcpy(buf, &token_val[ss->start], ret_len); + } + else + { + buf = &buf[ss->start]; + } + buf[ret_len] = '\0'; + return buf; + } + return NULL; + } + break; case SKIN_TOKEN_CHARACTER: if (token->value.c == '\n') diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h index e996c96613..7d7afe95b1 100644 --- a/apps/gui/skin_engine/wps_internals.h +++ b/apps/gui/skin_engine/wps_internals.h @@ -288,6 +288,12 @@ struct logical_if { int num_options; }; +struct substring { + int start; + int length; + struct wps_token *token; +}; + #ifdef HAVE_SKIN_VARIABLES struct skin_var { const char *label; -- cgit v1.2.3