From 9be2869c6ebad21621e10b3bd9e82dc811b75d2d Mon Sep 17 00:00:00 2001 From: deva Date: Thu, 12 Feb 2009 14:42:12 +0000 Subject: Added formatlanguage attribute to metawidget, and implemented lua parser for it. --- client/formatparser.cc | 18 ++++++++- client/formatparser.h | 2 +- client/lua.cc | 92 ++++++++++++++++++++++++++++++++++++-------- client/lua.h | 12 ++++-- client/macrowindow.cc | 2 +- client/widgets/metawidget.cc | 8 +++- client/widgets/metawidget.h | 1 + client/widgets/widget.cc | 5 ++- 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 #include -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 -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 +#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) -- cgit v1.2.3