mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2024-11-29 03:33:48 +00:00
Implement loadXMLTable() Lua function
This commit is contained in:
parent
82c2122774
commit
06963a8d6a
1 changed files with 85 additions and 0 deletions
|
@ -9450,6 +9450,89 @@ luaFunc(node_mmicon_alpha) { return mmicon_alpha(L, path(L)); }
|
||||||
luaFunc(node_mmicon_scaleWithDistance) { return mmicon_scaleWithDistance(L, path(L)); }
|
luaFunc(node_mmicon_scaleWithDistance) { return mmicon_scaleWithDistance(L, path(L)); }
|
||||||
luaFunc(node_mmicon_throb) { return mmicon_throb(L, path(L)); }
|
luaFunc(node_mmicon_throb) { return mmicon_throb(L, path(L)); }
|
||||||
|
|
||||||
|
|
||||||
|
class LuaXMLConverter : public tinyxml2::XMLVisitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
LuaXMLConverter(lua_State *lua) : L(lua) {}
|
||||||
|
virtual ~LuaXMLConverter() {}
|
||||||
|
|
||||||
|
virtual bool VisitEnter( const tinyxml2::XMLDocument& /*doc*/ )
|
||||||
|
{
|
||||||
|
lua_newtable(L);
|
||||||
|
indexes.push_back(0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool VisitExit( const tinyxml2::XMLDocument& /*doc*/ )
|
||||||
|
{
|
||||||
|
indexes.pop_back();
|
||||||
|
assert(indexes.empty());
|
||||||
|
// Leave the root table on the stack
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool VisitEnter( const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute *a)
|
||||||
|
{
|
||||||
|
lua_newtable(L);
|
||||||
|
indexes.push_back(0);
|
||||||
|
if(a)
|
||||||
|
{
|
||||||
|
lua_newtable(L);
|
||||||
|
for( ; a; a = a->Next())
|
||||||
|
{
|
||||||
|
lua_pushstring(L, a->Value());
|
||||||
|
lua_setfield(L, -2, a->Name());
|
||||||
|
}
|
||||||
|
lua_setfield(L, -2, "attr");
|
||||||
|
}
|
||||||
|
if(const char *name = element.Value())
|
||||||
|
{
|
||||||
|
lua_pushstring(L, name);
|
||||||
|
lua_setfield(L, -2, "name");
|
||||||
|
}
|
||||||
|
if(const char *text = element.GetText())
|
||||||
|
{
|
||||||
|
lua_pushstring(L, text);
|
||||||
|
lua_setfield(L, -2, "text");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool VisitExit( const tinyxml2::XMLElement& /*element*/ )
|
||||||
|
{
|
||||||
|
indexes.pop_back();
|
||||||
|
lua_rawseti(L, -2, ++indexes.back());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::vector<unsigned> indexes;
|
||||||
|
lua_State * const L;
|
||||||
|
};
|
||||||
|
|
||||||
|
luaFunc(loadXMLTable)
|
||||||
|
{
|
||||||
|
const std::string s = getString(L);
|
||||||
|
safePath(L, s);
|
||||||
|
std::string fn;
|
||||||
|
if(!findFile_helper(s.c_str(), fn))
|
||||||
|
luaReturnNil();
|
||||||
|
|
||||||
|
tinyxml2::XMLDocument xml;
|
||||||
|
tinyxml2::XMLError err = readXML(fn, xml);
|
||||||
|
if(err != tinyxml2::XML_NO_ERROR)
|
||||||
|
{
|
||||||
|
lua_pushboolean(L, false);
|
||||||
|
lua_pushinteger(L, err);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
LuaXMLConverter cvt(L);
|
||||||
|
xml.Accept(&cvt);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
#define luaRegister(func) {#func, l_##func}
|
#define luaRegister(func) {#func, l_##func}
|
||||||
|
@ -10501,6 +10584,8 @@ static const struct {
|
||||||
luaRegister(node_mmicon_scaleWithDistance),
|
luaRegister(node_mmicon_scaleWithDistance),
|
||||||
luaRegister(node_mmicon_throb),
|
luaRegister(node_mmicon_throb),
|
||||||
|
|
||||||
|
luaRegister(loadXMLTable),
|
||||||
|
|
||||||
#undef MK_FUNC
|
#undef MK_FUNC
|
||||||
#undef MK_ALIAS
|
#undef MK_ALIAS
|
||||||
#define MK_FUNC(base, getter, prefix, suffix) luaRegister(prefix##_##suffix),
|
#define MK_FUNC(base, getter, prefix, suffix) luaRegister(prefix##_##suffix),
|
||||||
|
|
Loading…
Reference in a new issue