forked from len0rd/rockbox
Theme Editor: Fixed parsing and code generation for nested conditionals
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26467 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
7f10b0336e
commit
496bcf39c7
3 changed files with 40 additions and 1 deletions
|
@ -25,6 +25,8 @@
|
||||||
#include "parsetreenode.h"
|
#include "parsetreenode.h"
|
||||||
#include "parsetreemodel.h"
|
#include "parsetreemodel.h"
|
||||||
|
|
||||||
|
int ParseTreeNode::openConditionals = 0;
|
||||||
|
|
||||||
/* Root element constructor */
|
/* Root element constructor */
|
||||||
ParseTreeNode::ParseTreeNode(struct skin_element* data)
|
ParseTreeNode::ParseTreeNode(struct skin_element* data)
|
||||||
: parent(0), element(0), param(0), children()
|
: parent(0), element(0), param(0), children()
|
||||||
|
@ -117,7 +119,8 @@ QString ParseTreeNode::genCode() const
|
||||||
buffer.append(TAGSYM);
|
buffer.append(TAGSYM);
|
||||||
buffer.append(children[i]->genCode());
|
buffer.append(children[i]->genCode());
|
||||||
}
|
}
|
||||||
buffer.append('\n');
|
if(openConditionals == 0)
|
||||||
|
buffer.append('\n');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SUBLINES:
|
case SUBLINES:
|
||||||
|
@ -131,6 +134,7 @@ QString ParseTreeNode::genCode() const
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CONDITIONAL:
|
case CONDITIONAL:
|
||||||
|
openConditionals++;
|
||||||
/* Inserts a %?, the tag renderer doesn't deal with the TAGSYM */
|
/* Inserts a %?, the tag renderer doesn't deal with the TAGSYM */
|
||||||
buffer.append(TAGSYM);
|
buffer.append(TAGSYM);
|
||||||
buffer.append(CONDITIONSYM);
|
buffer.append(CONDITIONSYM);
|
||||||
|
@ -145,6 +149,7 @@ QString ParseTreeNode::genCode() const
|
||||||
buffer.append(ENUMLISTSEPERATESYM);
|
buffer.append(ENUMLISTSEPERATESYM);
|
||||||
}
|
}
|
||||||
buffer.append(ENUMLISTCLOSESYM);
|
buffer.append(ENUMLISTCLOSESYM);
|
||||||
|
openConditionals--;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TAG:
|
case TAG:
|
||||||
|
|
|
@ -53,6 +53,8 @@ private:
|
||||||
struct skin_tag_parameter* param;
|
struct skin_tag_parameter* param;
|
||||||
QList<ParseTreeNode*> children;
|
QList<ParseTreeNode*> children;
|
||||||
|
|
||||||
|
static int openConditionals;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PARSETREENODE_H
|
#endif // PARSETREENODE_H
|
||||||
|
|
|
@ -295,6 +295,7 @@ struct skin_element* skin_parse_sublines_optional(char** document,
|
||||||
char* cursor = *document;
|
char* cursor = *document;
|
||||||
int sublines = 1;
|
int sublines = 1;
|
||||||
int i;
|
int i;
|
||||||
|
int nested = 0;
|
||||||
|
|
||||||
retval = skin_alloc_element();
|
retval = skin_alloc_element();
|
||||||
retval->type = SUBLINES;
|
retval->type = SUBLINES;
|
||||||
|
@ -311,8 +312,24 @@ struct skin_element* skin_parse_sublines_optional(char** document,
|
||||||
&& !(check_viewport(cursor) && cursor != *document))
|
&& !(check_viewport(cursor) && cursor != *document))
|
||||||
{
|
{
|
||||||
if(*cursor == COMMENTSYM)
|
if(*cursor == COMMENTSYM)
|
||||||
|
{
|
||||||
skip_comment(&cursor);
|
skip_comment(&cursor);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(*cursor == ENUMLISTOPENSYM && conditional)
|
||||||
|
{
|
||||||
|
nested++;
|
||||||
|
cursor++;
|
||||||
|
while(nested)
|
||||||
|
{
|
||||||
|
if(*cursor == ENUMLISTOPENSYM)
|
||||||
|
nested++;
|
||||||
|
if(*cursor == ENUMLISTCLOSESYM)
|
||||||
|
nested--;
|
||||||
|
cursor++;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* Accounting for escaped subline symbols */
|
/* Accounting for escaped subline symbols */
|
||||||
if(*cursor == TAGSYM)
|
if(*cursor == TAGSYM)
|
||||||
{
|
{
|
||||||
|
@ -637,6 +654,7 @@ int skin_parse_conditional(struct skin_element* element, char** document)
|
||||||
struct skin_element* tag = skin_alloc_element(); /* The tag to evaluate */
|
struct skin_element* tag = skin_alloc_element(); /* The tag to evaluate */
|
||||||
int children = 1;
|
int children = 1;
|
||||||
int i;
|
int i;
|
||||||
|
int nested = 0;
|
||||||
|
|
||||||
element->type = CONDITIONAL;
|
element->type = CONDITIONAL;
|
||||||
element->line = skin_line;
|
element->line = skin_line;
|
||||||
|
@ -660,6 +678,20 @@ int skin_parse_conditional(struct skin_element* element, char** document)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(*cursor == ENUMLISTOPENSYM)
|
||||||
|
{
|
||||||
|
nested++;
|
||||||
|
cursor++;
|
||||||
|
while(nested)
|
||||||
|
{
|
||||||
|
if(*cursor == ENUMLISTOPENSYM)
|
||||||
|
nested++;
|
||||||
|
if(*cursor == ENUMLISTCLOSESYM)
|
||||||
|
nested--;
|
||||||
|
cursor++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(*cursor == TAGSYM)
|
if(*cursor == TAGSYM)
|
||||||
{
|
{
|
||||||
cursor++;
|
cursor++;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue