tools/ejabberdsql2prosody: Use util.xml.
authorWaqas Hussain <waqas20@gmail.com>
Mon, 3 Dec 2012 00:34:46 +0000 (05:34 +0500)
committerWaqas Hussain <waqas20@gmail.com>
Mon, 3 Dec 2012 00:34:46 +0000 (05:34 +0500)
tools/ejabberdsql2prosody.lua

index c64faee0a502a02c508f28915eef76a5d6a6afd4..4372064386c37ba8d0494faf0fca6037fb3ff7b1 100644 (file)
@@ -12,6 +12,7 @@ prosody = {};
 package.path = package.path ..";../?.lua";
 local serialize = require "util.serialization".serialize;
 local st = require "util.stanza";
+local parse_xml = require "util.xml".parse;
 package.loaded["util.logger"] = {init = function() return function() end; end}
 local dm = require "util.datamanager"
 dm.set_data_path("data");
@@ -167,58 +168,6 @@ return readFile(filename);
 ------
 end
 
--- XML parser
-local parse_xml = (function()
-       local entity_map = setmetatable({
-               ["amp"] = "&";
-               ["gt"] = ">";
-               ["lt"] = "<";
-               ["apos"] = "'";
-               ["quot"] = "\"";
-       }, {__index = function(_, s)
-                       if s:sub(1,1) == "#" then
-                               if s:sub(2,2) == "x" then
-                                       return string.char(tonumber(s:sub(3), 16));
-                               else
-                                       return string.char(tonumber(s:sub(2)));
-                               end
-                       end
-               end
-       });
-       local function xml_unescape(str)
-               return (str:gsub("&(.-);", entity_map));
-       end
-       local function parse_tag(s)
-               local name,sattr=(s):gmatch("([^%s]+)(.*)")();
-               local attr = {};
-               for a,b in (sattr):gmatch("([^=%s]+)=['\"]([^'\"]*)['\"]") do attr[a] = xml_unescape(b); end
-               return name, attr;
-       end
-       return function(xml)
-               local stanza = st.stanza("root");
-               local regexp = "<([^>]*)>([^<]*)";
-               for elem, text in xml:gmatch(regexp) do
-                       if elem:sub(1,1) == "!" or elem:sub(1,1) == "?" then -- neglect comments and processing-instructions
-                       elseif elem:sub(1,1) == "/" then -- end tag
-                               elem = elem:sub(2);
-                               stanza:up(); -- TODO check for start-end tag name match
-                       elseif elem:sub(-1,-1) == "/" then -- empty tag
-                               elem = elem:sub(1,-2);
-                               local name,attr = parse_tag(elem);
-                               stanza:tag(name, attr):up();
-                       else -- start tag
-                               local name,attr = parse_tag(elem);
-                               stanza:tag(name, attr);
-                       end
-                       if #text ~= 0 then -- text
-                               stanza:text(xml_unescape(text));
-                       end
-               end
-               return stanza.tags[1];
-       end
-end)();
--- end of XML parser
-
 local arg, host = ...;
 local help = "/? -? ? /h -h /help -help --help";
 if not(arg and host) or help:find(arg, 1, true) then