util/stanza.lua
changeset 613 6c09127b50fb
parent 519 cccd610a0ef9
child 615 4ae3e81513f3
equal deleted inserted replaced
612:0d44fc0a78f8 613:6c09127b50fb
    18 --
    18 --
    19 
    19 
    20 
    20 
    21 local t_insert      =  table.insert;
    21 local t_insert      =  table.insert;
    22 local t_remove      =  table.remove;
    22 local t_remove      =  table.remove;
       
    23 local t_concat      =  table.concat;
    23 local s_format      = string.format;
    24 local s_format      = string.format;
    24 local tostring      =      tostring;
    25 local tostring      =      tostring;
    25 local setmetatable  =  setmetatable;
    26 local setmetatable  =  setmetatable;
    26 local pairs         =         pairs;
    27 local pairs         =         pairs;
    27 local ipairs        =        ipairs;
    28 local ipairs        =        ipairs;
    28 local type          =          type;
    29 local type          =          type;
    29 local next          =          next;
    30 local next          =          next;
    30 local print          =          print;
    31 local print         =         print;
    31 local unpack        =        unpack;
    32 local unpack        =        unpack;
    32 local s_gsub        =   string.gsub;
    33 local s_gsub        =   string.gsub;
    33 local os = os;
    34 local os            =            os;
    34 
    35 
    35 local do_pretty_printing = not os.getenv("WINDIR");
    36 local do_pretty_printing = not os.getenv("WINDIR");
    36 local getstyle, getstring = require "util.termcolours".getstyle, require "util.termcolours".getstring;
    37 local getstyle, getstring = require "util.termcolours".getstyle, require "util.termcolours".getstring;
    37 
    38 
    38 local log = require "util.logger".init("stanza");
    39 local log = require "util.logger".init("stanza");
   114 	function xml_escape(s) return s_gsub(s, "['&<>\"]", xml_entities); end
   115 	function xml_escape(s) return s_gsub(s, "['&<>\"]", xml_entities); end
   115 end
   116 end
   116 
   117 
   117 local xml_escape = xml_escape;
   118 local xml_escape = xml_escape;
   118 
   119 
       
   120 local function dostring(t, buf, self, xml_escape)
       
   121 	t_insert(buf, "<");
       
   122 	t_insert(buf, t.name);
       
   123 	for k, v in pairs(t.attr) do if type(k) == "string" then
       
   124 		t_insert(buf, " ");
       
   125 		t_insert(buf, k);
       
   126 		t_insert(buf, "='");
       
   127 		t_insert(buf, (xml_escape(tostring(v))));
       
   128 		t_insert(buf, "'");
       
   129 	end end
       
   130 	t_insert(buf, ">");
       
   131 	for n, child in ipairs(t) do
       
   132 		if child.name then 
       
   133 			self(child, buf, self, xml_escape);
       
   134 		else
       
   135 			t_insert(buf, (xml_escape(child)));
       
   136 		end
       
   137 	end
       
   138 	t_insert(buf, "</");
       
   139 	t_insert(buf, t.name);
       
   140 	t_insert(buf, ">");
       
   141 end
       
   142 
   119 function stanza_mt.__tostring(t)
   143 function stanza_mt.__tostring(t)
   120 	local children_text = "";
   144 	local buf = {};
   121 	for n, child in ipairs(t) do
   145 	dostring(t, buf, dostring, xml_escape);
   122 		if type(child) == "string" then	
   146 	return t_concat(buf);
   123 			children_text = children_text .. xml_escape(child);
   147 end
   124 		else
   148 
   125 			children_text = children_text .. tostring(child);
       
   126 		end
       
   127 	end
       
   128 
       
   129 	local attr_string = "";
       
   130 	if t.attr then
       
   131 		for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. s_format(" %s='%s'", k, xml_escape(tostring(v))); end end
       
   132 	end
       
   133 	return s_format("<%s%s>%s</%s>", t.name, attr_string, children_text, t.name);
       
   134 end
       
   135 
   149 
   136 function stanza_mt.top_tag(t)
   150 function stanza_mt.top_tag(t)
   137 	local attr_string = "";
   151 	local attr_string = "";
   138 	if t.attr then
   152 	if t.attr then
   139 		for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. s_format(" %s='%s'", k, xml_escape(tostring(v))); end end
   153 		for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. s_format(" %s='%s'", k, xml_escape(tostring(v))); end end