mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 02:27:39 -04:00
Theme Editor: Fixed a bug in the subline parser, added a LINE element to contain logical lines, working on data model
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26337 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
deb1600bbc
commit
8ea056db4b
7 changed files with 58 additions and 27 deletions
|
@ -19,14 +19,11 @@
|
|||
*
|
||||
****************************************************************************/
|
||||
|
||||
namespace wps
|
||||
{
|
||||
extern "C"
|
||||
{
|
||||
#include "skin_parser.h"
|
||||
#include "skin_debug.h"
|
||||
}
|
||||
}
|
||||
|
||||
#include <cstdlib>
|
||||
#include <cstdio>
|
||||
|
@ -39,13 +36,14 @@ namespace wps
|
|||
int main(int argc, char* argv[])
|
||||
{
|
||||
|
||||
char* doc = "%Vd(U)\n\n%?bl(test,3,5,2,1)<param2|param3>";
|
||||
char doc[] = "%Vd(U);Hey\n%?bl(test,3,5,2,1)<param2|param3>";
|
||||
|
||||
struct wps::skin_element* test = wps::skin_parse(doc);
|
||||
struct skin_element* test = skin_parse(doc);
|
||||
|
||||
wps::skin_debug_tree(test);
|
||||
skin_debug_tree(test);
|
||||
|
||||
skin_free_tree(test);
|
||||
|
||||
wps::skin_free_tree(test);
|
||||
|
||||
QApplication app(argc, argv);
|
||||
|
||||
|
|
|
@ -27,7 +27,6 @@ ParseTreeModel::ParseTreeModel(char* wps, QObject* parent):
|
|||
QAbstractItemModel(parent)
|
||||
{
|
||||
this->wps = skin_parse(wps);
|
||||
skin_debug_tree(this->wps);
|
||||
this->root = new ParseTreeNode(this->wps, 0, true);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,15 +1,33 @@
|
|||
#include "parsetreenode.h"
|
||||
|
||||
ParseTreeNode::ParseTreeNode(struct skin_element* data, ParseTreeNode* parent,
|
||||
bool stop):
|
||||
parentLink(parent), element(data)
|
||||
bool tree)
|
||||
{
|
||||
|
||||
if(stop)
|
||||
return;
|
||||
for(int i = 0; i < 5; i++)
|
||||
appendChild(new ParseTreeNode(data, this, true));
|
||||
if(tree)
|
||||
{
|
||||
while(data)
|
||||
{
|
||||
appendChild(new ParseTreeNode(data, this, false));
|
||||
data = data->next;
|
||||
}
|
||||
parentLink = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
element = data;
|
||||
parentLink = parent;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ParseTreeNode::ParseTreeNode(struct skin_tag_parameter* param,
|
||||
ParseTreeNode* parent)
|
||||
:parentLink(parent), element(0), param(param)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
ParseTreeNode::~ParseTreeNode()
|
||||
{
|
||||
|
|
|
@ -13,7 +13,8 @@ extern "C"
|
|||
class ParseTreeNode
|
||||
{
|
||||
public:
|
||||
ParseTreeNode(struct skin_element* data, ParseTreeNode* parent, bool stop = false);
|
||||
ParseTreeNode(struct skin_element* data, ParseTreeNode* parent, bool tree);
|
||||
ParseTreeNode(struct skin_tag_parameter* param, ParseTreeNode* parent);
|
||||
virtual ~ParseTreeNode();
|
||||
|
||||
void appendChild(ParseTreeNode* child);
|
||||
|
@ -29,6 +30,7 @@ private:
|
|||
ParseTreeNode* parentLink;
|
||||
QList<ParseTreeNode*> children;
|
||||
struct skin_element* element;
|
||||
struct skin_tag_parameter* param;
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -129,17 +129,10 @@ void skin_debug_tree(struct skin_element* root)
|
|||
debug_indent_level++;
|
||||
for(i = 0; i < current->children_count; i++)
|
||||
{
|
||||
skin_debug_indent();
|
||||
printf("[ Subline %d\n", i);
|
||||
|
||||
debug_indent_level++;
|
||||
skin_debug_tree(current->children[i]);
|
||||
debug_indent_level--;
|
||||
|
||||
skin_debug_indent();
|
||||
printf("]\n");
|
||||
}
|
||||
debug_indent_level--;
|
||||
|
||||
skin_debug_indent();
|
||||
printf("]\n");
|
||||
break;
|
||||
|
@ -175,6 +168,16 @@ void skin_debug_tree(struct skin_element* root)
|
|||
|
||||
break;
|
||||
|
||||
case LINE:
|
||||
printf("[ Logical line on line %d\n", current->line);
|
||||
|
||||
debug_indent_level++;
|
||||
skin_debug_tree(current->children[0]);
|
||||
debug_indent_level--;
|
||||
|
||||
skin_debug_indent();
|
||||
printf("]\n");
|
||||
break;
|
||||
}
|
||||
|
||||
current = current->next;
|
||||
|
|
|
@ -151,6 +151,14 @@ struct skin_element* skin_parse_line_optional(char** document, int conditional)
|
|||
|
||||
struct skin_element* root = NULL;
|
||||
struct skin_element* current = NULL;
|
||||
struct skin_element* retval = NULL;
|
||||
|
||||
/* A wrapper for the line */
|
||||
retval = skin_alloc_element();
|
||||
retval->type = LINE;
|
||||
retval->line = skin_line;
|
||||
retval->children_count = 1;
|
||||
retval->children = skin_alloc_children(1);
|
||||
|
||||
while(*cursor != '\n' && *cursor != '\0' && *cursor != MULTILINESYM
|
||||
&& !((*cursor == ARGLISTSEPERATESYM
|
||||
|
@ -214,7 +222,8 @@ struct skin_element* skin_parse_line_optional(char** document, int conditional)
|
|||
/* Moving up the calling function's pointer */
|
||||
*document = cursor;
|
||||
|
||||
return root;
|
||||
retval->children[0] = root;
|
||||
return retval;
|
||||
}
|
||||
|
||||
struct skin_element* skin_parse_sublines(char** document)
|
||||
|
@ -233,6 +242,7 @@ struct skin_element* skin_parse_sublines_optional(char** document,
|
|||
retval = skin_alloc_element();
|
||||
retval->type = SUBLINES;
|
||||
retval->next = NULL;
|
||||
retval->line = skin_line;
|
||||
|
||||
/* First we count the sublines */
|
||||
while(*cursor != '\0' && *cursor != '\n'
|
||||
|
@ -276,7 +286,7 @@ struct skin_element* skin_parse_sublines_optional(char** document,
|
|||
skin_error(MULTILINE_EXPECTED);
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
else if(i != sublines - 1)
|
||||
{
|
||||
cursor++;
|
||||
}
|
||||
|
|
|
@ -41,7 +41,8 @@ enum skin_element_type
|
|||
COMMENT,
|
||||
TAG,
|
||||
CONDITIONAL,
|
||||
SUBLINES
|
||||
SUBLINES,
|
||||
LINE
|
||||
};
|
||||
|
||||
enum skin_errorcode
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue