mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 02:27:39 -04:00
[Feature] %ft file text tags add prefix search
%ft(filename,search_text) finds a line beginning with search_text strips search_text and returns the remainder of the line Change-Id: I06fe029b89aa60e4dbf34c039d180c75213519a4
This commit is contained in:
parent
632e72273d
commit
7c678f5e7a
3 changed files with 41 additions and 9 deletions
|
@ -1343,14 +1343,30 @@ static int parse_filetext(struct skin_element *element,
|
||||||
(void)wps_data;
|
(void)wps_data;
|
||||||
const char* filename;
|
const char* filename;
|
||||||
char buf[MAX_PATH];
|
char buf[MAX_PATH];
|
||||||
|
char *buf_start = buf;
|
||||||
int fd;
|
int fd;
|
||||||
int line = 0;
|
int line = 0;
|
||||||
|
const char *search_text = NULL;
|
||||||
|
int search_len = 0;
|
||||||
|
|
||||||
/* format: %ft(filename[,line]) */
|
/* format: %ft(filename[,line|search text]) */
|
||||||
filename = get_param_text(element, 0);
|
filename = get_param_text(element, 0);
|
||||||
|
|
||||||
if (element->params_count == 2)
|
if (element->params_count == 2)
|
||||||
line = get_param(element, 1)->data.number;
|
{
|
||||||
|
struct skin_tag_parameter *param1 = get_param(element, 1);
|
||||||
|
if (param1->type == INTEGER)
|
||||||
|
line = param1->data.number;
|
||||||
|
else if (param1->type == STRING)
|
||||||
|
{
|
||||||
|
search_text = get_param_text(element, 1);
|
||||||
|
line = 0x3FF; /* 1k lines is a pretty large file */
|
||||||
|
search_len = strlen(search_text);
|
||||||
|
DEBUGF("%s: found search text %s\n", __func__, search_text);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return WPS_ERROR_INVALID_PARAM;
|
||||||
|
}
|
||||||
else if (element->params_count != 1)
|
else if (element->params_count != 1)
|
||||||
{
|
{
|
||||||
DEBUGF("%s(file, line): %s Error: param count %d\n",
|
DEBUGF("%s(file, line): %s Error: param count %d\n",
|
||||||
|
@ -1364,7 +1380,7 @@ static int parse_filetext(struct skin_element *element,
|
||||||
path_append(buf, ROCKBOX_DIR, filename, sizeof(buf));
|
path_append(buf, ROCKBOX_DIR, filename, sizeof(buf));
|
||||||
DEBUGF("%s %s[%d]\n", __func__, buf, line);
|
DEBUGF("%s %s[%d]\n", __func__, buf, line);
|
||||||
|
|
||||||
if ((fd = open_utf8(buf, O_RDONLY)) < 0)
|
if (line > 0x3FF || (fd = open_utf8(buf, O_RDONLY)) < 0)
|
||||||
{
|
{
|
||||||
DEBUGF("%s: Error Opening %s\n", __func__, buf);
|
DEBUGF("%s: Error Opening %s\n", __func__, buf);
|
||||||
goto failure;
|
goto failure;
|
||||||
|
@ -1373,8 +1389,15 @@ static int parse_filetext(struct skin_element *element,
|
||||||
int rd = 0;
|
int rd = 0;
|
||||||
while (line >= 0)
|
while (line >= 0)
|
||||||
{
|
{
|
||||||
if ((rd = read_line(fd, buf, sizeof(buf))) < 0)
|
if ((rd = read_line(fd, buf, sizeof(buf))) <= 0)
|
||||||
break;
|
break;
|
||||||
|
if (search_text && strncasecmp(buf, search_text, search_len) == 0)
|
||||||
|
{
|
||||||
|
buf_start += search_len;
|
||||||
|
rd -= search_len;
|
||||||
|
DEBUGF("%s: found '%s' Reading '%s'\n", __func__, search_text, buf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
line--;
|
line--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1386,10 +1409,11 @@ static int parse_filetext(struct skin_element *element,
|
||||||
|
|
||||||
if (element->is_conditional)
|
if (element->is_conditional)
|
||||||
{
|
{
|
||||||
|
buf_start = buf;
|
||||||
rd = 1; /* just alloc enough for the conditional to work*/
|
rd = 1; /* just alloc enough for the conditional to work*/
|
||||||
}
|
}
|
||||||
|
|
||||||
buf[rd] = '\0';
|
buf_start[rd] = '\0';
|
||||||
|
|
||||||
char * skinbuf = skin_buffer_alloc(rd+1);
|
char * skinbuf = skin_buffer_alloc(rd+1);
|
||||||
|
|
||||||
|
@ -1399,7 +1423,7 @@ static int parse_filetext(struct skin_element *element,
|
||||||
close(fd);
|
close(fd);
|
||||||
return WPS_ERROR_INVALID_PARAM;
|
return WPS_ERROR_INVALID_PARAM;
|
||||||
}
|
}
|
||||||
strcpy(skinbuf, buf);
|
strcpy(skinbuf, buf_start);
|
||||||
close(fd);
|
close(fd);
|
||||||
token->value.data = PTRTOSKINOFFSET(skin_buffer, skinbuf);
|
token->value.data = PTRTOSKINOFFSET(skin_buffer, skinbuf);
|
||||||
token->type = SKIN_TOKEN_STRING;
|
token->type = SKIN_TOKEN_STRING;
|
||||||
|
|
|
@ -50,7 +50,7 @@ static const struct tag_info legal_tags[] =
|
||||||
TAG(SKIN_TOKEN_FILE_SIZE, "fs", "", SKIN_REFRESH_STATIC),
|
TAG(SKIN_TOKEN_FILE_SIZE, "fs", "", SKIN_REFRESH_STATIC),
|
||||||
TAG(SKIN_TOKEN_FILE_VBR, "fv", "", SKIN_REFRESH_STATIC),
|
TAG(SKIN_TOKEN_FILE_VBR, "fv", "", SKIN_REFRESH_STATIC),
|
||||||
TAG(SKIN_TOKEN_FILE_DIRECTORY, "d" , "I", SKIN_REFRESH_STATIC),
|
TAG(SKIN_TOKEN_FILE_DIRECTORY, "d" , "I", SKIN_REFRESH_STATIC),
|
||||||
TAG(SKIN_TOKEN_FILE_TEXT, "ft" , "F|i", SKIN_REFRESH_STATIC),
|
TAG(SKIN_TOKEN_FILE_TEXT, "ft" , "F|[is]", SKIN_REFRESH_STATIC),
|
||||||
|
|
||||||
TAG(SKIN_TOKEN_FILE_BITRATE, "Fb", "", SKIN_REFRESH_STATIC),
|
TAG(SKIN_TOKEN_FILE_BITRATE, "Fb", "", SKIN_REFRESH_STATIC),
|
||||||
TAG(SKIN_TOKEN_FILE_CODEC, "Fc", "", SKIN_REFRESH_STATIC),
|
TAG(SKIN_TOKEN_FILE_CODEC, "Fc", "", SKIN_REFRESH_STATIC),
|
||||||
|
|
|
@ -758,18 +758,26 @@ a horizontal progressbar which doesn't fill and draws the image
|
||||||
\end{description}
|
\end{description}
|
||||||
|
|
||||||
\begin{tagmap}
|
\begin{tagmap}
|
||||||
\config{\%ft(filename [,line]} & Get a line of text from a file.\\
|
\config{\%ft(filename [,line|search_text]} & Get a line of text from a file.\\
|
||||||
\end{tagmap}
|
\end{tagmap}
|
||||||
Use this tag to check for the existence of a file or read a line of text from a file.
|
Use this tag to check for the existence of a file or read a line of text from a file.
|
||||||
Checking if a file exists can be done with \%?(ft(filename)<Found|NotFound>
|
Checking if a file exists can be done with \%?(ft(filename)<Found|NotFound>
|
||||||
similarly you can also check if a specific line exists with \%?(ft(filename, n)<Found|NotFound>
|
similarly you can also check if a specific line exists with \%?(ft(filename, n)<Found|NotFound>
|
||||||
where n is the desired line.
|
where n is the desired line.
|
||||||
|
or supply search text and do a search (ignoring case) of the beginning of each line.
|
||||||
|
If found this prefix will be removed and the rest of the string returned to the end of line.
|
||||||
|
\%?(ft(filename, search_text)<Found|NotFound>
|
||||||
|
|
||||||
Note: empty files or files that do not exist are ignored by the skin engine otherwise
|
Note: empty files or files that do not exist are ignored by the skin engine otherwise
|
||||||
\begin{description}
|
\begin{description}
|
||||||
\item[filename] -- filename Note: files can only be found in \fname{/.rockbox} directory or one of its children.
|
\item[filename] -- filename Note: files can only be found in \fname{/.rockbox} directory or one of its children.
|
||||||
eg. \%ft(wps/file.txt) would refer to \fname{/.rockbox/wps/file.txt}
|
eg. \%ft(wps/file.txt) would refer to \fname{/.rockbox/wps/file.txt}
|
||||||
\item[line] -- OPTIONAL, which line to grab, defaults to the first line.
|
\item[line] -- OPTIONAL, which line to grab, defaults to the first line.
|
||||||
Note: lines must end with CR or LF but may not exceed 320 characters
|
Note: lines must end with CR or LF but may not exceed 320 characters, Max 1023 lines
|
||||||
|
\item[search_text] -- OPTIONAL, instead of a line number find a line that begins with search_text.
|
||||||
|
Note: search_text will be stripped from beginning of string quotes should not be included
|
||||||
|
unless you want to search for a string containing them
|
||||||
|
lines must end with CR or LF but may not exceed 320 characters including search text.
|
||||||
\end{description}
|
\end{description}
|
||||||
|
|
||||||
\begin{tagmap}
|
\begin{tagmap}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue