diff options
author | Jonathan Gordon <rockbox@jdgordon.info> | 2011-09-11 01:50:06 +0000 |
---|---|---|
committer | Jonathan Gordon <rockbox@jdgordon.info> | 2011-09-11 01:50:06 +0000 |
commit | 3b9ffd28da4d2af023e6a77ab1d6ee683f90ef6b (patch) | |
tree | d779dd815acee6218e59e96329916114dcdf9ecd /apps/gui | |
parent | 86c543216f13c1171eefd6dd8116855a7fa9c4bd (diff) | |
download | rockbox-3b9ffd28da4d2af023e6a77ab1d6ee683f90ef6b.tar.gz rockbox-3b9ffd28da4d2af023e6a77ab1d6ee683f90ef6b.zip |
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
Diffstat (limited to 'apps/gui')
-rw-r--r-- | apps/gui/skin_engine/skin_parser.c | 21 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_tokens.c | 29 | ||||
-rw-r--r-- | apps/gui/skin_engine/wps_internals.h | 6 |
3 files changed, 55 insertions, 1 deletions
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, | |||
720 | return 0; | 720 | return 0; |
721 | } | 721 | } |
722 | 722 | ||
723 | static int parse_substring_tag(struct skin_element* element, | ||
724 | struct wps_token *token, | ||
725 | struct wps_data *wps_data) | ||
726 | { | ||
727 | (void)wps_data; | ||
728 | struct substring *ss = (struct substring*)skin_buffer_alloc(sizeof(struct substring)); | ||
729 | if (!ss) | ||
730 | return 1; | ||
731 | ss->start = element->params[0].data.number; | ||
732 | if (element->params[1].type == DEFAULT) | ||
733 | ss->length = -1; | ||
734 | else | ||
735 | ss->length = element->params[1].data.number; | ||
736 | ss->token = element->params[2].data.code->data; | ||
737 | token->value.data = ss; | ||
738 | return 0; | ||
739 | } | ||
740 | |||
723 | static int parse_progressbar_tag(struct skin_element* element, | 741 | static int parse_progressbar_tag(struct skin_element* element, |
724 | struct wps_token *token, | 742 | struct wps_token *token, |
725 | struct wps_data *wps_data) | 743 | struct wps_data *wps_data) |
@@ -1788,6 +1806,9 @@ static int skin_element_callback(struct skin_element* element, void* data) | |||
1788 | case SKIN_TOKEN_LOGICAL_IF: | 1806 | case SKIN_TOKEN_LOGICAL_IF: |
1789 | function = parse_logical_if; | 1807 | function = parse_logical_if; |
1790 | break; | 1808 | break; |
1809 | case SKIN_TOKEN_SUBSTRING: | ||
1810 | function = parse_substring_tag; | ||
1811 | break; | ||
1791 | case SKIN_TOKEN_PROGRESSBAR: | 1812 | case SKIN_TOKEN_PROGRESSBAR: |
1792 | case SKIN_TOKEN_VOLUME: | 1813 | case SKIN_TOKEN_VOLUME: |
1793 | case SKIN_TOKEN_BATTERY_PERCENT: | 1814 | 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, | |||
868 | struct logical_if *lif = token->value.data; | 868 | struct logical_if *lif = token->value.data; |
869 | return get_lif_token_value(gwps, lif, offset, buf, buf_size); | 869 | return get_lif_token_value(gwps, lif, offset, buf, buf_size); |
870 | } | 870 | } |
871 | break; | 871 | break; |
872 | case SKIN_TOKEN_SUBSTRING: | ||
873 | { | ||
874 | struct substring *ss = token->value.data; | ||
875 | const char *token_val = get_token_value(gwps, ss->token, offset, | ||
876 | buf, buf_size, intval); | ||
877 | int ret_len = ss->length; | ||
878 | if (token_val) | ||
879 | { | ||
880 | int len = strlen(token_val); | ||
881 | if (len < ss->start) | ||
882 | return NULL; | ||
883 | if (ret_len < 0) | ||
884 | ret_len = strlen(token_val) - ss->start; | ||
885 | if (token_val != buf) | ||
886 | { | ||
887 | memcpy(buf, &token_val[ss->start], ret_len); | ||
888 | } | ||
889 | else | ||
890 | { | ||
891 | buf = &buf[ss->start]; | ||
892 | } | ||
893 | buf[ret_len] = '\0'; | ||
894 | return buf; | ||
895 | } | ||
896 | return NULL; | ||
897 | } | ||
898 | break; | ||
872 | 899 | ||
873 | case SKIN_TOKEN_CHARACTER: | 900 | case SKIN_TOKEN_CHARACTER: |
874 | if (token->value.c == '\n') | 901 | 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 { | |||
288 | int num_options; | 288 | int num_options; |
289 | }; | 289 | }; |
290 | 290 | ||
291 | struct substring { | ||
292 | int start; | ||
293 | int length; | ||
294 | struct wps_token *token; | ||
295 | }; | ||
296 | |||
291 | #ifdef HAVE_SKIN_VARIABLES | 297 | #ifdef HAVE_SKIN_VARIABLES |
292 | struct skin_var { | 298 | struct skin_var { |
293 | const char *label; | 299 | const char *label; |