diff options
Diffstat (limited to 'util')
-rw-r--r-- | util/stanza.lua | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/util/stanza.lua b/util/stanza.lua index dceb0e73..3f6c4b76 100644 --- a/util/stanza.lua +++ b/util/stanza.lua @@ -20,6 +20,7 @@ local t_insert = table.insert; local t_remove = table.remove; +local t_concat = table.concat; local s_format = string.format; local tostring = tostring; local setmetatable = setmetatable; @@ -27,10 +28,10 @@ local pairs = pairs; local ipairs = ipairs; local type = type; local next = next; -local print = print; +local print = print; local unpack = unpack; local s_gsub = string.gsub; -local os = os; +local os = os; local do_pretty_printing = not os.getenv("WINDIR"); local getstyle, getstring = require "util.termcolours".getstyle, require "util.termcolours".getstring; @@ -116,23 +117,36 @@ end local xml_escape = xml_escape; -function stanza_mt.__tostring(t) - local children_text = ""; +local function dostring(t, buf, self, xml_escape) + t_insert(buf, "<"); + t_insert(buf, t.name); + for k, v in pairs(t.attr) do if type(k) == "string" then + t_insert(buf, " "); + t_insert(buf, k); + t_insert(buf, "='"); + t_insert(buf, (xml_escape(tostring(v)))); + t_insert(buf, "'"); + end end + t_insert(buf, ">"); for n, child in ipairs(t) do - if type(child) == "string" then - children_text = children_text .. xml_escape(child); + if child.name then + self(child, buf, self, xml_escape); else - children_text = children_text .. tostring(child); + t_insert(buf, (xml_escape(child))); end end + t_insert(buf, "</"); + t_insert(buf, t.name); + t_insert(buf, ">"); +end - local attr_string = ""; - if t.attr then - 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 - end - return s_format("<%s%s>%s</%s>", t.name, attr_string, children_text, t.name); +function stanza_mt.__tostring(t) + local buf = {}; + dostring(t, buf, dostring, xml_escape); + return t_concat(buf); end + function stanza_mt.top_tag(t) local attr_string = ""; if t.attr then |