diff options
-rw-r--r-- | plugins/storage/mod_xep0227.lua | 2 | ||||
-rw-r--r-- | plugins/storage/xmlparse.lib.lua | 56 | ||||
-rw-r--r-- | tools/ejabberdsql2prosody.lua | 53 | ||||
-rw-r--r-- | tools/jabberd14sql2prosody.lua | 51 | ||||
-rw-r--r-- | tools/migration/migrator/jabberd14.lua | 51 | ||||
-rw-r--r-- | tools/openfire2prosody.lua | 52 | ||||
-rw-r--r-- | util/template.lua | 54 | ||||
-rw-r--r-- | util/xml.lua | 57 |
8 files changed, 64 insertions, 312 deletions
diff --git a/plugins/storage/mod_xep0227.lua b/plugins/storage/mod_xep0227.lua index ac0441b1..5d07a2ea 100644 --- a/plugins/storage/mod_xep0227.lua +++ b/plugins/storage/mod_xep0227.lua @@ -8,7 +8,7 @@ local os_remove = os.remove; local io_open = io.open; local st = require "util.stanza"; -local parse_xml_real = module:require("xmlparse"); +local parse_xml_real = require "util.xml".parse; local function getXml(user, host) local jid = user.."@"..host; diff --git a/plugins/storage/xmlparse.lib.lua b/plugins/storage/xmlparse.lib.lua deleted file mode 100644 index 91063995..00000000 --- a/plugins/storage/xmlparse.lib.lua +++ /dev/null @@ -1,56 +0,0 @@ -
-local st = require "util.stanza";
-
--- 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
-
-return parse_xml;
diff --git a/tools/ejabberdsql2prosody.lua b/tools/ejabberdsql2prosody.lua index c64faee0..43720643 100644 --- a/tools/ejabberdsql2prosody.lua +++ b/tools/ejabberdsql2prosody.lua @@ -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 diff --git a/tools/jabberd14sql2prosody.lua b/tools/jabberd14sql2prosody.lua index 2ead742f..b85d2c20 100644 --- a/tools/jabberd14sql2prosody.lua +++ b/tools/jabberd14sql2prosody.lua @@ -445,57 +445,8 @@ dm.set_data_path("data"); local datetime = require "util.datetime"; -local lxp = require "lxp"; local st = require "util.stanza"; - -local parse_xml = (function() - local ns_prefixes = { - ["http://www.w3.org/XML/1998/namespace"] = "xml"; - }; - local ns_separator = "\1"; - local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$"; - return function(xml) - local handler = {}; - local stanza = st.stanza("root"); - function handler:StartElement(tagname, attr) - local curr_ns,name = tagname:match(ns_pattern); - if name == "" then - curr_ns, name = "", curr_ns; - end - if curr_ns ~= "" then - attr.xmlns = curr_ns; - end - for i=1,#attr do - local k = attr[i]; - attr[i] = nil; - local ns, nm = k:match(ns_pattern); - if nm ~= "" then - ns = ns_prefixes[ns]; - if ns then - attr[ns..":"..nm] = attr[k]; - attr[k] = nil; - end - end - end - stanza:tag(name, attr); - end - function handler:CharacterData(data) - stanza:text(data); - end - function handler:EndElement(tagname) - stanza:up(); - end - local parser = lxp.new(handler, "\1"); - local ok, err, line, col = parser:parse(xml); - if ok then ok, err, line, col = parser:parse(); end - --parser:close(); - if ok then - return stanza.tags[1]; - else - return ok, err.." (line "..line..", col "..col..")"; - end - end; -end)(); +local parse_xml = require "util.xml".parse; function store_password(username, host, password) -- create or update account for username@host diff --git a/tools/migration/migrator/jabberd14.lua b/tools/migration/migrator/jabberd14.lua index 54c45d94..2f0b0b78 100644 --- a/tools/migration/migrator/jabberd14.lua +++ b/tools/migration/migrator/jabberd14.lua @@ -1,7 +1,7 @@ local lfs = require "lfs"; -local lxp = require "lxp"; local st = require "util.stanza"; +local parse_xml = require "util.xml".parse; local os_getenv = os.getenv; local io_open = io.open; local assert = assert; @@ -17,55 +17,6 @@ local function clean_path(path) return path:gsub("\\", "/"):gsub("//+", "/"):gsub("^~", os_getenv("HOME") or "~"); end -local parse_xml = (function() - local ns_prefixes = { - ["http://www.w3.org/XML/1998/namespace"] = "xml"; - }; - local ns_separator = "\1"; - local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$"; - return function(xml) - local handler = {}; - local stanza = st.stanza("root"); - function handler:StartElement(tagname, attr) - local curr_ns,name = tagname:match(ns_pattern); - if name == "" then - curr_ns, name = "", curr_ns; - end - if curr_ns ~= "" then - attr.xmlns = curr_ns; - end - for i=1,#attr do - local k = attr[i]; - attr[i] = nil; - local ns, nm = k:match(ns_pattern); - if nm ~= "" then - ns = ns_prefixes[ns]; - if ns then - attr[ns..":"..nm] = attr[k]; - attr[k] = nil; - end - end - end - stanza:tag(name, attr); - end - function handler:CharacterData(data) - stanza:text(data); - end - function handler:EndElement(tagname) - stanza:up(); - end - local parser = lxp.new(handler, "\1"); - local ok, err, line, col = parser:parse(xml); - if ok then ok, err, line, col = parser:parse(); end - --parser:close(); - if ok then - return stanza.tags[1]; - else - return ok, err.." (line "..line..", col "..col..")"; - end - end; -end)(); - local function load_xml(path) local f, err = io_open(path); if not f then return f, err; end diff --git a/tools/openfire2prosody.lua b/tools/openfire2prosody.lua index 49d0dc5e..bdea9a63 100644 --- a/tools/openfire2prosody.lua +++ b/tools/openfire2prosody.lua @@ -18,57 +18,7 @@ elseif package.config:sub(1,1) == "/" then prosody.platform = "posix"; end -local lxp = require "lxp"; -local st = require "util.stanza"; - -local parse_xml = (function() - local ns_prefixes = { - ["http://www.w3.org/XML/1998/namespace"] = "xml"; - }; - local ns_separator = "\1"; - local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$"; - return function(xml) - local handler = {}; - local stanza = st.stanza("root"); - function handler:StartElement(tagname, attr) - local curr_ns,name = tagname:match(ns_pattern); - if name == "" then - curr_ns, name = "", curr_ns; - end - if curr_ns ~= "" then - attr.xmlns = curr_ns; - end - for i=1,#attr do - local k = attr[i]; - attr[i] = nil; - local ns, nm = k:match(ns_pattern); - if nm ~= "" then - ns = ns_prefixes[ns]; - if ns then - attr[ns..":"..nm] = attr[k]; - attr[k] = nil; - end - end - end - stanza:tag(name, attr); - end - function handler:CharacterData(data) - stanza:text(data); - end - function handler:EndElement(tagname) - stanza:up(); - end - local parser = lxp.new(handler, "\1"); - local ok, err, line, col = parser:parse(xml); - if ok then ok, err, line, col = parser:parse(); end - --parser:close(); - if ok then - return stanza.tags[1]; - else - return ok, err.." (line "..line..", col "..col..")"; - end - end; -end)(); +local parse_xml = require "util.xml".parse; ----------------------------------------------------------------------- diff --git a/util/template.lua b/util/template.lua index 5e9b479e..66d4fca7 100644 --- a/util/template.lua +++ b/util/template.lua @@ -1,6 +1,5 @@ -local st = require "util.stanza"; -local lxp = require "lxp"; +local stanza_mt = require "util.stanza".stanza_mt; local setmetatable = setmetatable; local pairs = pairs; local ipairs = ipairs; @@ -8,58 +7,10 @@ local error = error; local loadstring = loadstring; local debug = debug; local t_remove = table.remove; +local parse_xml = require "util.xml".parse; module("template") -local parse_xml = (function() - local ns_prefixes = { - ["http://www.w3.org/XML/1998/namespace"] = "xml"; - }; - local ns_separator = "\1"; - local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$"; - return function(xml) - local handler = {}; - local stanza = st.stanza("root"); - function handler:StartElement(tagname, attr) - local curr_ns,name = tagname:match(ns_pattern); - if name == "" then - curr_ns, name = "", curr_ns; - end - if curr_ns ~= "" then - attr.xmlns = curr_ns; - end - for i=1,#attr do - local k = attr[i]; - attr[i] = nil; - local ns, nm = k:match(ns_pattern); - if nm ~= "" then - ns = ns_prefixes[ns]; - if ns then - attr[ns..":"..nm] = attr[k]; - attr[k] = nil; - end - end - end - stanza:tag(name, attr); - end - function handler:CharacterData(data) - stanza:text(data); - end - function handler:EndElement(tagname) - stanza:up(); - end - local parser = lxp.new(handler, "\1"); - local ok, err, line, col = parser:parse(xml); - if ok then ok, err, line, col = parser:parse(); end - --parser:close(); - if ok then - return stanza.tags[1]; - else - return ok, err.." (line "..line..", col "..col..")"; - end - end; -end)(); - local function trim_xml(stanza) for i=#stanza,1,-1 do local child = stanza[i]; @@ -113,7 +64,6 @@ local function create_clone_string(stanza, lookup, xmlns) end return lookup[stanza]; end -local stanza_mt = st.stanza_mt; local function create_cloner(stanza, chunkname) local lookup = {}; local name = create_clone_string(stanza, lookup, ""); diff --git a/util/xml.lua b/util/xml.lua new file mode 100644 index 00000000..db446bc3 --- /dev/null +++ b/util/xml.lua @@ -0,0 +1,57 @@ + +local st = require "util.stanza"; +local lxp = require "lxp"; + +module("template") + +local parse_xml = (function() + local ns_prefixes = { + ["http://www.w3.org/XML/1998/namespace"] = "xml"; + }; + local ns_separator = "\1"; + local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$"; + return function(xml) + local handler = {}; + local stanza = st.stanza("root"); + function handler:StartElement(tagname, attr) + local curr_ns,name = tagname:match(ns_pattern); + if name == "" then + curr_ns, name = "", curr_ns; + end + if curr_ns ~= "" then + attr.xmlns = curr_ns; + end + for i=1,#attr do + local k = attr[i]; + attr[i] = nil; + local ns, nm = k:match(ns_pattern); + if nm ~= "" then + ns = ns_prefixes[ns]; + if ns then + attr[ns..":"..nm] = attr[k]; + attr[k] = nil; + end + end + end + stanza:tag(name, attr); + end + function handler:CharacterData(data) + stanza:text(data); + end + function handler:EndElement(tagname) + stanza:up(); + end + local parser = lxp.new(handler, "\1"); + local ok, err, line, col = parser:parse(xml); + if ok then ok, err, line, col = parser:parse(); end + --parser:close(); + if ok then + return stanza.tags[1]; + else + return ok, err.." (line "..line..", col "..col..")"; + end + end; +end)(); + +parse = parse_xml; +return _M; |