X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Fstanza.lua;h=4e833caad35d3f3e3bb771645035752b818bf08e;hb=863f00a39e9e9a50569b3390c5bc16f27c4e88ea;hp=526bb2f0f5c45e892fbfd886e2e0ee2ff83301fe;hpb=14b07e19c6db6eefe35fac05b1772e7ee9a74436;p=prosody.git diff --git a/util/stanza.lua b/util/stanza.lua index 526bb2f0..4e833caa 100644 --- a/util/stanza.lua +++ b/util/stanza.lua @@ -1,4 +1,4 @@ --- Prosody IM v0.4 +-- Prosody IM -- Copyright (C) 2008-2009 Matthew Wild -- Copyright (C) 2008-2009 Waqas Hussain -- @@ -6,7 +6,6 @@ -- COPYING file in the source package for more information. -- - local t_insert = table.insert; local t_concat = table.concat; local t_remove = table.remove; @@ -23,16 +22,24 @@ local next = next; local print = print; local unpack = unpack; local s_gsub = string.gsub; +local s_char = string.char; +local s_find = string.find; local os = os; local do_pretty_printing = not os.getenv("WINDIR"); -local getstyle, getstring = require "util.termcolours".getstyle, require "util.termcolours".getstring; - -local log = require "util.logger".init("stanza"); +local getstyle, getstring; +if do_pretty_printing then + local ok, termcolours = pcall(require, "util.termcolours"); + if ok then + getstyle, getstring = termcolours.getstyle, termcolours.getstring; + else + do_pretty_printing = nil; + end +end module "stanza" -stanza_mt = {}; +stanza_mt = { __type = "stanza" }; stanza_mt.__index = stanza_mt; function stanza(name, attr) @@ -116,54 +123,48 @@ function stanza_mt:childtags() end +local xml_escape do - local xml_entities = { ["'"] = "'", ["\""] = """, ["<"] = "<", [">"] = ">", ["&"] = "&" }; - function xml_escape(s) return s_gsub(s, "['&<>\"]", xml_entities); end + local escape_table = { ["'"] = "'", ["\""] = """, ["<"] = "<", [">"] = ">", ["&"] = "&" }; + function xml_escape(str) return (s_gsub(str, "['&<>\"]", escape_table)); end + _M.xml_escape = xml_escape; end -local xml_escape = xml_escape; - -local function dostring(t, buf, self, xml_escape) - local nsid, ns, attrk = 0; - t_insert(buf, "<"); - t_insert(buf, t.name); - for k, v in pairs(t.attr) do if type(k) == "string" then - t_insert(buf, " "); - ns, attrk = s_match(k, "^([^|]+)|(.+)$"); - if ns then - nsid = (nsid or -1) + 1; - t_insert(buf, "xmlns:ns"..nsid); - t_insert(buf, "='"); - t_insert(buf, (xml_escape(tostring(ns)))); - t_insert(buf, "' "); - t_insert(buf, "ns"..nsid..":"..attrk); +local function _dostring(t, buf, self, xml_escape) + local nsid = 0; + local name = t.name + t_insert(buf, "<"..name); + for k, v in pairs(t.attr) do + if s_find(k, "|", 1, true) then + local ns, attrk = s_match(k, "^([^|]+)|(.+)$"); + nsid = nsid + 1; + t_insert(buf, " xmlns:ns"..nsid.."='"..xml_escape(ns).."' ".."ns"..nsid..":"..attrk.."='"..xml_escape(v).."'"); else - t_insert(buf, k); + t_insert(buf, " "..k.."='"..xml_escape(v).."'"); end - 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 child.name then - self(child, buf, self, xml_escape); - else - t_insert(buf, (xml_escape(child))); + end + local len = #t; + if len == 0 then + t_insert(buf, "/>"); + else + t_insert(buf, ">"); + for n=1,len do + local child = t[n]; + if child.name then + self(child, buf, self, xml_escape); + else + t_insert(buf, xml_escape(child)); + end end + t_insert(buf, ""); end - t_insert(buf, ""); end - function stanza_mt.__tostring(t) local buf = {}; - dostring(t, buf, dostring, xml_escape); + _dostring(t, buf, _dostring, xml_escape); return t_concat(buf); end - function stanza_mt.top_tag(t) local attr_string = ""; if t.attr then @@ -172,17 +173,23 @@ function stanza_mt.top_tag(t) return s_format("<%s%s>", t.name, attr_string); end +function stanza_mt.get_text(t) + if #t.tags == 0 then + return t_concat(t); + end +end + function stanza_mt.__add(s1, s2) return s1:add_direct_child(s2); end do - local id = 0; - function new_id() - id = id + 1; - return "lx"..id; - end + local id = 0; + function new_id() + id = id + 1; + return "lx"..id; + end end function preserialize(stanza) @@ -200,6 +207,8 @@ end function deserialize(stanza) -- Set metatable if stanza then + local attr = stanza.attr; + for i=1,#attr do attr[i] = nil; end setmetatable(stanza, stanza_mt); for _, child in ipairs(stanza) do if type(child) == "table" then @@ -225,21 +234,22 @@ function deserialize(stanza) end function clone(stanza) - local lookup_table = {}; - local function _copy(object) - if type(object) ~= "table" then - return object; - elseif lookup_table[object] then - return lookup_table[object]; - end - local new_table = {}; - lookup_table[object] = new_table; - for index, value in pairs(object) do - new_table[_copy(index)] = _copy(value); - end - return setmetatable(new_table, getmetatable(object)); - end - return _copy(stanza) + local lookup_table = {}; + local function _copy(object) + if type(object) ~= "table" then + return object; + elseif lookup_table[object] then + return lookup_table[object]; + end + local new_table = {}; + lookup_table[object] = new_table; + for index, value in pairs(object) do + new_table[_copy(index)] = _copy(value); + end + return setmetatable(new_table, getmetatable(object)); + end + + return _copy(stanza) end function message(attr, body)