diff options
author | Matthew Wild <mwild1@gmail.com> | 2008-12-10 15:32:13 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2008-12-10 15:32:13 +0000 |
commit | 8e253779f90cc222a82cdab224def4cf9813fdac (patch) | |
tree | 6d54aac465aafb1d184435d739c2e80997eb63f2 | |
parent | 2ad1dbfa75b21cdab3fa200a641d1e2848e71df0 (diff) | |
download | prosody-8e253779f90cc222a82cdab224def4cf9813fdac.tar.gz prosody-8e253779f90cc222a82cdab224def4cf9813fdac.zip |
New, faster, stanza serialization
-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 |