Changeset

5221:115cf8252be8

Merge 0.9->trunk.
author Waqas Hussain <waqas20@gmail.com>
date Mon, 03 Dec 2012 06:07:00 +0500
parents 5212:c2b431042a54 (current diff) 5220:98b71d519fff (diff)
children 5224:ba51d0917c64
files plugins/storage/xmlparse.lib.lua
diffstat 8 files changed, 64 insertions(+), 312 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/storage/mod_xep0227.lua	Sat Dec 01 00:31:33 2012 +0500
+++ b/plugins/storage/mod_xep0227.lua	Mon Dec 03 06:07:00 2012 +0500
@@ -8,7 +8,7 @@
 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;
--- a/plugins/storage/xmlparse.lib.lua	Sat Dec 01 00:31:33 2012 +0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -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;
--- a/tools/ejabberdsql2prosody.lua	Sat Dec 01 00:31:33 2012 +0500
+++ b/tools/ejabberdsql2prosody.lua	Mon Dec 03 06:07:00 2012 +0500
@@ -12,6 +12,7 @@
 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 @@
 ------
 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
--- a/tools/jabberd14sql2prosody.lua	Sat Dec 01 00:31:33 2012 +0500
+++ b/tools/jabberd14sql2prosody.lua	Mon Dec 03 06:07:00 2012 +0500
@@ -445,57 +445,8 @@
 
 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
--- a/tools/migration/migrator/jabberd14.lua	Sat Dec 01 00:31:33 2012 +0500
+++ b/tools/migration/migrator/jabberd14.lua	Mon Dec 03 06:07:00 2012 +0500
@@ -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 @@
 	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
--- a/tools/openfire2prosody.lua	Sat Dec 01 00:31:33 2012 +0500
+++ b/tools/openfire2prosody.lua	Mon Dec 03 06:07:00 2012 +0500
@@ -18,57 +18,7 @@
 	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;
 
 -----------------------------------------------------------------------
 
--- a/util/template.lua	Sat Dec 01 00:31:33 2012 +0500
+++ b/util/template.lua	Mon Dec 03 06:07:00 2012 +0500
@@ -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 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 @@
 	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, "");
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/util/xml.lua	Mon Dec 03 06:07:00 2012 +0500
@@ -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;