Merge with 0.5
[prosody.git] / util / stanza.lua
index 35d600ed4bc153b4b8e2e36eacb2a58c1b4e213a..4e833caad35d3f3e3bb771645035752b818bf08e 100644 (file)
@@ -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;
@@ -28,13 +27,19 @@ 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)
@@ -118,10 +123,13 @@ function stanza_mt:childtags()
                                            
 end
 
-local xml_escape = (function()
+local xml_escape
+do
        local escape_table = { ["'"] = "&apos;", ["\""] = "&quot;", ["<"] = "&lt;", [">"] = "&gt;", ["&"] = "&amp;" };
-       return function(str) return (s_gsub(str, "['&<>\"]", escape_table)); end
-end)();
+       function xml_escape(str) return (s_gsub(str, "['&<>\"]", escape_table)); end
+       _M.xml_escape = xml_escape;
+end
+
 local function _dostring(t, buf, self, xml_escape)
        local nsid = 0;
        local name = t.name
@@ -177,11 +185,11 @@ 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)
@@ -226,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)