diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/LuaXML.cc | 72 | 
1 files changed, 72 insertions, 0 deletions
| diff --git a/lib/LuaXML.cc b/lib/LuaXML.cc new file mode 100644 index 0000000..606870e --- /dev/null +++ b/lib/LuaXML.cc @@ -0,0 +1,72 @@ +#include "tinyxml.h" + +#include <BLua.h> + +void LuaXML_ParseNode (lua_State *L,TiXmlNode* pNode) { PROFILE +    if (!pNode) return; +    // resize stack if neccessary +    luaL_checkstack(L, 5, "LuaXML_ParseNode : recursion too deep"); +     +    TiXmlElement* pElem = pNode->ToElement(); +    if (pElem) { +        // element name +        lua_pushstring(L,"name"); +        lua_pushstring(L,pElem->Value()); +        lua_settable(L,-3); +         +        // parse attributes +        TiXmlAttribute* pAttr = pElem->FirstAttribute(); +        if (pAttr) { +            lua_pushstring(L,"attr"); +            lua_newtable(L); +            for (;pAttr;pAttr = pAttr->Next()) { +                lua_pushstring(L,pAttr->Name()); +                lua_pushstring(L,pAttr->Value()); +                lua_settable(L,-3); +                 +            } +            lua_settable(L,-3); +        } +    } +     +    // children +    TiXmlNode *pChild = pNode->FirstChild(); +    if (pChild) { +        int iChildCount = 0; +        for(;pChild;pChild = pChild->NextSibling()) { +            switch (pChild->Type()) { +                case TiXmlNode::DOCUMENT: break; +                case TiXmlNode::ELEMENT:  +                    // normal element, parse recursive +                    lua_newtable(L); +                    LuaXML_ParseNode(L,pChild); +                    lua_rawseti(L,-2,++iChildCount); +                break; +                case TiXmlNode::COMMENT: break; +                case TiXmlNode::TEXT:  +                    // plaintext, push raw +                    lua_pushstring(L,pChild->Value()); +                    lua_rawseti(L,-2,++iChildCount); +                break; +                case TiXmlNode::DECLARATION: break; +                case TiXmlNode::UNKNOWN: break; +            }; +        } +        lua_pushstring(L,"n"); +        lua_pushnumber(L,iChildCount); +        lua_settable(L,-3); +    } +} + +static int LuaXML_ParseFile (lua_State *L) { PROFILE +    const char* sFileName = luaL_checkstring(L,1); +    TiXmlDocument doc(sFileName); +    doc.LoadFile(); +    lua_newtable(L); +    LuaXML_ParseNode(L,&doc); +    return 1; +} + +void    RegisterLuaXML (lua_State *L) { +    lua_register(L,"LuaXML_ParseFile",LuaXML_ParseFile); +} | 
