summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2011-09-11 01:50:06 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2011-09-11 01:50:06 +0000
commit3b9ffd28da4d2af023e6a77ab1d6ee683f90ef6b (patch)
treed779dd815acee6218e59e96329916114dcdf9ecd
parent86c543216f13c1171eefd6dd8116855a7fa9c4bd (diff)
downloadrockbox-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
-rw-r--r--apps/gui/skin_engine/skin_parser.c21
-rw-r--r--apps/gui/skin_engine/skin_tokens.c29
-rw-r--r--apps/gui/skin_engine/wps_internals.h6
-rw-r--r--lib/skin_parser/tag_table.c3
-rw-r--r--lib/skin_parser/tag_table.h2
5 files changed, 59 insertions, 2 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
723static 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
723static int parse_progressbar_tag(struct skin_element* element, 741static 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
291struct substring {
292 int start;
293 int length;
294 struct wps_token *token;
295};
296
291#ifdef HAVE_SKIN_VARIABLES 297#ifdef HAVE_SKIN_VARIABLES
292struct skin_var { 298struct skin_var {
293 const char *label; 299 const char *label;
diff --git a/lib/skin_parser/tag_table.c b/lib/skin_parser/tag_table.c
index 849e1d92dd..b93aa28c32 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[] =
236 { SKIN_TOKEN_VAR_SET, "vs", "SSI|I", SKIN_REFRESH_STATIC }, 236 { SKIN_TOKEN_VAR_SET, "vs", "SSI|I", SKIN_REFRESH_STATIC },
237 { SKIN_TOKEN_VAR_GETVAL, "vg", "S", SKIN_REFRESH_DYNAMIC }, 237 { SKIN_TOKEN_VAR_GETVAL, "vg", "S", SKIN_REFRESH_DYNAMIC },
238 { SKIN_TOKEN_VAR_TIMEOUT, "vl", "S|D", SKIN_REFRESH_DYNAMIC }, 238 { SKIN_TOKEN_VAR_TIMEOUT, "vl", "S|D", SKIN_REFRESH_DYNAMIC },
239 239
240 { SKIN_TOKEN_SUBSTRING, "ss", "IiT", SKIN_REFRESH_DYNAMIC },
240 { SKIN_TOKEN_UNKNOWN, "" , "", 0 } 241 { SKIN_TOKEN_UNKNOWN, "" , "", 0 }
241 /* Keep this here to mark the end of the table */ 242 /* Keep this here to mark the end of the table */
242}; 243};
diff --git a/lib/skin_parser/tag_table.h b/lib/skin_parser/tag_table.h
index 5a93e36866..82ee4757be 100644
--- a/lib/skin_parser/tag_table.h
+++ b/lib/skin_parser/tag_table.h
@@ -279,6 +279,8 @@ enum skin_token_type {
279 SKIN_TOKEN_VAR_SET, 279 SKIN_TOKEN_VAR_SET,
280 SKIN_TOKEN_VAR_GETVAL, 280 SKIN_TOKEN_VAR_GETVAL,
281 SKIN_TOKEN_VAR_TIMEOUT, 281 SKIN_TOKEN_VAR_TIMEOUT,
282
283 SKIN_TOKEN_SUBSTRING,
282}; 284};
283 285
284/* 286/*