diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index a866101..b65d409 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; + memcpy(&ss->tag, &element->params[2], sizeof(ss->tag)); + 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 ed72241..30721bb 100644 --- a/apps/gui/skin_engine/skin_tokens.c +++ b/apps/gui/skin_engine/skin_tokens.c @@ -868,7 +868,35 @@ 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; + struct wps_token *source = ss->tag.data.code->children[0]->data; + const char *token_val = get_token_value(gwps, source, 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 e996c96..c2d2c1d 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 skin_tag_parameter tag; +}; + #ifdef HAVE_SKIN_VARIABLES struct skin_var { const char *label; diff --git a/lib/skin_parser/tag_table.c b/lib/skin_parser/tag_table.c index 849e1d9..f60b031 100644 --- a/lib/skin_parser/tag_table.c +++ b/lib/skin_parser/tag_table.c @@ -236,7 +236,8 @@ static const struct tag_info legal_tags[] = { SKIN_TOKEN_VAR_SET, "vs", "SSI|I", SKIN_REFRESH_STATIC }, { SKIN_TOKEN_VAR_GETVAL, "vg", "S", SKIN_REFRESH_DYNAMIC }, { SKIN_TOKEN_VAR_TIMEOUT, "vl", "S|D", SKIN_REFRESH_DYNAMIC }, - + + { SKIN_TOKEN_SUBSTRING, "ss", "IiC", SKIN_REFRESH_DYNAMIC }, { SKIN_TOKEN_UNKNOWN, "" , "", 0 } /* Keep this here to mark the end of the table */ }; diff --git a/lib/skin_parser/tag_table.h b/lib/skin_parser/tag_table.h index 5a93e36..82ee475 100644 --- a/lib/skin_parser/tag_table.h +++ b/lib/skin_parser/tag_table.h @@ -279,6 +279,8 @@ enum skin_token_type { SKIN_TOKEN_VAR_SET, SKIN_TOKEN_VAR_GETVAL, SKIN_TOKEN_VAR_TIMEOUT, + + SKIN_TOKEN_SUBSTRING, }; /*