1
0
Fork 0
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:
Robert Bieber 2010-06-02 07:48:48 +00:00
parent 7f10b0336e
commit 496bcf39c7
3 changed files with 40 additions and 1 deletions

View file

@ -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:

View file

@ -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

View file

@ -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++;