summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordeva <deva>2009-02-12 14:42:12 +0000
committerdeva <deva>2009-02-12 14:42:12 +0000
commit9be2869c6ebad21621e10b3bd9e82dc811b75d2d (patch)
tree499aa5af9dfd80aae4c07437f2f55f21241e5891
parent22e0b0ddd78f13b2648befe892d9ec6c5b1b1229 (diff)
Added formatlanguage attribute to metawidget, and implemented lua parser for it.
-rw-r--r--client/formatparser.cc18
-rw-r--r--client/formatparser.h2
-rw-r--r--client/lua.cc92
-rw-r--r--client/lua.h12
-rw-r--r--client/macrowindow.cc2
-rw-r--r--client/widgets/metawidget.cc8
-rw-r--r--client/widgets/metawidget.h1
-rw-r--r--client/widgets/widget.cc5
8 files changed, 116 insertions, 24 deletions
diff --git a/client/formatparser.cc b/client/formatparser.cc
index 0f04d0a..751c83e 100644
--- a/client/formatparser.cc
+++ b/client/formatparser.cc
@@ -30,7 +30,16 @@
#include <QVariant>
#include <string.h>
-QString format_parser(QString format, QVector< Widget *> widgets)
+#include "lua.h"
+
+static QString format_parser_lua(QString format, QVector< Widget *> widgets)
+{
+ LUA lua(&widgets);
+
+ return lua.runParser(format);
+}
+
+static QString format_parser_pracro(QString format, QVector< Widget *> widgets)
{
QString resume;
QString var;
@@ -172,3 +181,10 @@ QString format_parser(QString format, QSqlQuery &query)
return resume;
}
+
+QString format_parser(QString format, QVector< Widget *> widgets, QString language)
+{
+ if(language == "pracro") return format_parser_pracro(format, widgets);
+ if(language == "lua") return format_parser_lua(format, widgets);
+ return "";
+}
diff --git a/client/formatparser.h b/client/formatparser.h
index 5d900b0..92f978f 100644
--- a/client/formatparser.h
+++ b/client/formatparser.h
@@ -32,7 +32,7 @@
#include "widgets/widget.h"
#include <QSqlQuery>
-QString format_parser(QString format, QVector< Widget *> widgets);
+QString format_parser(QString format, QVector< Widget *> widgets, QString language);
QString format_parser(QString format, QSqlQuery &query);
#endif/*__PRACRO_FORMATPARSER_H__*/
diff --git a/client/lua.cc b/client/lua.cc
index 2dcd279..5e6850b 100644
--- a/client/lua.cc
+++ b/client/lua.cc
@@ -175,9 +175,10 @@ static int _setVisible(lua_State *L)
}
-LUA::LUA(MacroWindow *macrowindow)
+LUA::LUA(QVector< Widget *> *widgets, QVector< Widget *> *auxwidgets)
{
- this->macrowindow = macrowindow;
+ this->widgets = widgets;
+ this->auxwidgets = auxwidgets;
L = luaL_newstate();
if(L == NULL) {
@@ -204,36 +205,36 @@ LUA::~LUA()
QString LUA::getValue(QString name)
{
- Widget *widget = macrowindow->getWidget(name);
+ Widget *widget = getWidget(name);
if(widget) return widget->getValue();
return "";
}
void LUA::setValue(QString name, QString value)
{
- Widget *widget = macrowindow->getWidget(name);
+ Widget *widget = getWidget(name);
if(widget) widget->setValue(value);
}
void LUA::enable(QString name)
{
- Widget *widget = macrowindow->getWidget(name);
+ Widget *widget = getWidget(name);
if(widget) widget->enable();
}
void LUA::disable(QString name)
{
- Widget *widget = macrowindow->getWidget(name);
+ Widget *widget = getWidget(name);
if(widget) widget->disable();
}
void LUA::setVisible(QString name, bool value)
{
- Widget *widget = macrowindow->getWidget(name);
+ Widget *widget = getWidget(name);
if(widget) widget->setVisibility(value);
}
-bool LUA::run(QString program, QString name, QString value)
+bool LUA::runValidator(QString program, QString name, QString value)
{
if(L == NULL) {
error("LUA state not initialized!");
@@ -245,10 +246,6 @@ bool LUA::run(QString program, QString name, QString value)
name.toStdString().c_str(),
value.toStdString().c_str() );
- if(macrowindow->luaprograms.contains(program) == false) return false;
-
- // printf("%s\n", macrowindow->luaprograms.value(program).toStdString().c_str());
-
lua_pushstring(L, value.toStdString().c_str());
lua_setglobal(L, "value");
@@ -257,11 +254,10 @@ bool LUA::run(QString program, QString name, QString value)
int top = lua_gettop(L);
- QString luaprogram = macrowindow->luaprograms.value(program);
if(luaL_loadbuffer(L,
- luaprogram.toStdString().c_str(),
- luaprogram.size(),
- program.toStdString().c_str())) {
+ program.toStdString().c_str(),
+ program.size(),
+ name.toStdString().c_str())) {
error(lua_tostring(L, lua_gettop(L)));
return false;
}
@@ -288,7 +284,71 @@ bool LUA::run(QString program, QString name, QString value)
return res;
}
+QString LUA::runParser(QString program)
+{
+ if(L == NULL) {
+ error("LUA state not initialized!");
+ return false;
+ }
+
+ printf("Running %s\n", program.toStdString().c_str());
+
+ int top = lua_gettop(L);
+
+ if(luaL_loadbuffer(L,
+ program.toStdString().c_str(),
+ program.size(),
+ "parser")) {
+ error(lua_tostring(L, lua_gettop(L)));
+ return false;
+ }
+
+ // Run the loaded code
+ if(lua_pcall(L, 0, LUA_MULTRET, 0)) {
+ error(lua_tostring(L, lua_gettop(L)));
+ return false;
+ }
+
+ if(top != lua_gettop(L) - 1) {
+ error("Program did not return a single value.\n");
+ return false;
+ }
+
+ if(lua_isstring(L, lua_gettop(L)) == false) {
+ error("Program did not return a boolean value.\n");
+ return false;
+ }
+
+ QString res = lua_tostring(L, lua_gettop(L));
+ lua_pop(L, 1);
+
+ return res;
+}
+
void LUA::error(QString message)
{
printf("LUA ERROR: %s\n", message.toStdString().c_str());
}
+
+Widget *LUA::getWidget(QString name)
+{
+ QVector< Widget* >::iterator i = widgets->begin();
+ while (i != widgets->end()) {
+ Widget* w = *i;
+ if(name == w->getName()) return w;
+ i++;
+ }
+
+ if(auxwidgets) {
+ QVector< Widget* >::iterator j = auxwidgets->begin();
+ while (j != auxwidgets->end()) {
+ Widget* w = *j;
+ if(name == w->getName()) return w;
+ j++;
+ }
+ }
+
+ printf("WARNING: Widget %s not found\n", name.toStdString().c_str());
+
+ return NULL;
+}
diff --git a/client/lua.h b/client/lua.h
index 4777dd4..ba074dd 100644
--- a/client/lua.h
+++ b/client/lua.h
@@ -32,14 +32,17 @@
#include <QString>
+#include "widgets/widget.h"
+
class MacroWindow;
class LUA {
public:
- LUA(MacroWindow *macrowindow);
+ LUA(QVector< Widget *> *widgets, QVector< Widget *> *auxwidgets = NULL);
~LUA();
- bool run(QString program, QString name, QString value);
+ bool runValidator(QString program, QString name, QString value);
+ QString runParser(QString program);
QString getValue(QString name);
void setValue(QString name, QString value);
@@ -49,9 +52,12 @@ public:
void error(QString message);
+ Widget *getWidget(QString name);
+
private:
lua_State *L;
- MacroWindow *macrowindow;
+ QVector< Widget *> *widgets;
+ QVector< Widget *> *auxwidgets;
};
#endif/*__PRACRO_LUA_H__*/
diff --git a/client/macrowindow.cc b/client/macrowindow.cc
index 2206929..6beba85 100644
--- a/client/macrowindow.cc
+++ b/client/macrowindow.cc
@@ -54,7 +54,7 @@ MacroWindow::MacroWindow(NetCom *netcom, QDomNode &xml_doc, QString course,
setCollapsedWidget(new ResumeWidget(compact));
- this->lua = new LUA(this);
+ this->lua = new LUA(&this->widgets, &this->auxwidgets);
update(xml_doc);
diff --git a/client/widgets/metawidget.cc b/client/widgets/metawidget.cc
index 5102a04..c085f10 100644
--- a/client/widgets/metawidget.cc
+++ b/client/widgets/metawidget.cc
@@ -55,6 +55,12 @@ MetaWidget::MetaWidget(QDomNode &node, MacroWindow *macrowindow)
else macrowindow->addAuxWidgets(widgets);
// Setup format string
+ if(elem.hasAttribute("formatlanguage")) {
+ formatlanguage = elem.attribute("formatlanguage");
+ } else {
+ formatlanguage = "pracro";
+ }
+
if(elem.hasAttribute("format")) {
format = elem.attribute("format");
} else {
@@ -83,7 +89,7 @@ void MetaWidget::changed()
QString MetaWidget::getValue()
{
- return format_parser(format, widgets);
+ return format_parser(format, widgets, formatlanguage);
}
void MetaWidget::setValue(QString, QString)
diff --git a/client/widgets/metawidget.h b/client/widgets/metawidget.h
index 77b79d7..022197a 100644
--- a/client/widgets/metawidget.h
+++ b/client/widgets/metawidget.h
@@ -70,6 +70,7 @@ private:
QListWidget *list;
QVector< Widget* > widgets;
QString format;
+ QString formatlanguage;
bool storechildren;
};
diff --git a/client/widgets/widget.cc b/client/widgets/widget.cc
index 0857d67..870fc4b 100644
--- a/client/widgets/widget.cc
+++ b/client/widgets/widget.cc
@@ -81,8 +81,11 @@ bool Widget::regexpValidator()
bool Widget::luaValidator()
{
if(!hasluaprogram) return true;
+
+ if(macrowindow->luaprograms.contains(luaprogram) == false) return false;
+ QString program = macrowindow->luaprograms.value(luaprogram);
- return macrowindow->lua->run(luaprogram, getName(), getValue());
+ return macrowindow->lua->runValidator(program, getName(), getValue());
}
void Widget::setInitialValue(QString value)