util/stanza.lua
changeset 1984 f2b1f89e1d7c
parent 1935 05adeddf9f1b
child 2077 e33658f6052c
equal deleted inserted replaced
1983:1f49d778bd98 1984:f2b1f89e1d7c
     3 -- Copyright (C) 2008-2009 Waqas Hussain
     3 -- Copyright (C) 2008-2009 Waqas Hussain
     4 -- 
     4 -- 
     5 -- This project is MIT/X11 licensed. Please see the
     5 -- This project is MIT/X11 licensed. Please see the
     6 -- COPYING file in the source package for more information.
     6 -- COPYING file in the source package for more information.
     7 --
     7 --
       
     8 
     8 
     9 
     9 local t_insert      =  table.insert;
    10 local t_insert      =  table.insert;
    10 local t_concat      =  table.concat;
    11 local t_concat      =  table.concat;
    11 local t_remove      =  table.remove;
    12 local t_remove      =  table.remove;
    12 local t_concat      =  table.concat;
    13 local t_concat      =  table.concat;
   128 	local escape_table = { ["'"] = "&apos;", ["\""] = "&quot;", ["<"] = "&lt;", [">"] = "&gt;", ["&"] = "&amp;" };
   129 	local escape_table = { ["'"] = "&apos;", ["\""] = "&quot;", ["<"] = "&lt;", [">"] = "&gt;", ["&"] = "&amp;" };
   129 	function xml_escape(str) return (s_gsub(str, "['&<>\"]", escape_table)); end
   130 	function xml_escape(str) return (s_gsub(str, "['&<>\"]", escape_table)); end
   130 	_M.xml_escape = xml_escape;
   131 	_M.xml_escape = xml_escape;
   131 end
   132 end
   132 
   133 
   133 local function _dostring(t, buf, self, xml_escape)
   134 local function _dostring(t, buf, self, xml_escape, parentns)
   134 	local nsid = 0;
   135 	local nsid = 0;
   135 	local name = t.name
   136 	local name = t.name
   136 	t_insert(buf, "<"..name);
   137 	t_insert(buf, "<"..name);
   137 	for k, v in pairs(t.attr) do
   138 	for k, v in pairs(t.attr) do
   138 		if s_find(k, "|", 1, true) then
   139 		if s_find(k, "|", 1, true) then
   139 			local ns, attrk = s_match(k, "^([^|]+)|(.+)$");
   140 			local ns, attrk = s_match(k, "^([^|]+)|(.+)$");
   140 			nsid = nsid + 1;
   141 			nsid = nsid + 1;
   141 			t_insert(buf, " xmlns:ns"..nsid.."='"..xml_escape(ns).."' ".."ns"..nsid..":"..attrk.."='"..xml_escape(v).."'");
   142 			t_insert(buf, " xmlns:ns"..nsid.."='"..xml_escape(ns).."' ".."ns"..nsid..":"..attrk.."='"..xml_escape(v).."'");
   142 		else
   143                elseif not(k == "xmlns" and v == parentns) then
   143 			t_insert(buf, " "..k.."='"..xml_escape(v).."'");
   144 			t_insert(buf, " "..k.."='"..xml_escape(v).."'");
   144 		end
   145 		end
   145 	end
   146 	end
   146 	local len = #t;
   147 	local len = #t;
   147 	if len == 0 then
   148 	if len == 0 then
   149 	else
   150 	else
   150 		t_insert(buf, ">");
   151 		t_insert(buf, ">");
   151 		for n=1,len do
   152 		for n=1,len do
   152 			local child = t[n];
   153 			local child = t[n];
   153 			if child.name then
   154 			if child.name then
   154 				self(child, buf, self, xml_escape);
   155                                self(child, buf, self, xml_escape, t.attr.xmlns);
   155 			else
   156 			else
   156 				t_insert(buf, xml_escape(child));
   157 				t_insert(buf, xml_escape(child));
   157 			end
   158 			end
   158 		end
   159 		end
   159 		t_insert(buf, "</"..name..">");
   160 		t_insert(buf, "</"..name..">");
   160 	end
   161 	end
   161 end
   162 end
   162 function stanza_mt.__tostring(t)
   163 function stanza_mt.__tostring(t)
   163 	local buf = {};
   164 	local buf = {};
   164 	_dostring(t, buf, _dostring, xml_escape);
   165        _dostring(t, buf, _dostring, xml_escape, nil);
   165 	return t_concat(buf);
   166 	return t_concat(buf);
   166 end
   167 end
   167 
   168 
   168 function stanza_mt.top_tag(t)
   169 function stanza_mt.top_tag(t)
   169 	local attr_string = "";
   170 	local attr_string = "";