diff options
author | matthew <devnull@localhost> | 2008-08-22 21:09:04 +0000 |
---|---|---|
committer | matthew <devnull@localhost> | 2008-08-22 21:09:04 +0000 |
commit | d0a4f8f2fb4b0927a67ebc7428d6c5cb66d2fbd4 (patch) | |
tree | 7582e73a42b4becdfb964269bfaee8ab3a16317c /util/stanza.lua | |
download | prosody-d0a4f8f2fb4b0927a67ebc7428d6c5cb66d2fbd4.tar.gz prosody-d0a4f8f2fb4b0927a67ebc7428d6c5cb66d2fbd4.zip |
First commit, where do you want to go tomorrow?
Diffstat (limited to 'util/stanza.lua')
-rw-r--r-- | util/stanza.lua | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/util/stanza.lua b/util/stanza.lua new file mode 100644 index 00000000..88d0609f --- /dev/null +++ b/util/stanza.lua @@ -0,0 +1,104 @@ +local t_insert = table.insert; +local t_remove = table.remove; +local format = string.format; +local tostring = tostring; +local setmetatable= setmetatable; +local pairs = pairs; +local ipairs = ipairs; + +module "stanza" + +stanza_mt = {}; +stanza_mt.__index = stanza_mt; + +function stanza(name, attr) + local stanza = { name = name, attr = attr or {}, last_add = {}}; + return setmetatable(stanza, stanza_mt); +end + +function stanza_mt:iq(attrs) + return self + stanza("iq", attrs) +end +function stanza_mt:message(attrs) + return self + stanza("message", attrs) +end +function stanza_mt:presence(attrs) + return self + stanza("presence", attrs) +end +function stanza_mt:query(xmlns) + return self:tag("query", { xmlns = xmlns }); +end +function stanza_mt:tag(name, attrs) + local s = stanza(name, attrs); + (self.last_add[#self.last_add] or self):add_child(s); + t_insert(self.last_add, s); + return self; +end + +function stanza_mt:text(text) + (self.last_add[#self.last_add] or self):add_child(text); + return self; +end + +function stanza_mt:up() + t_remove(self.last_add); + return self; +end + +function stanza_mt:add_child(child) + t_insert(self, child); +end + +function stanza_mt:child_with_name(name) + for _, child in ipairs(self) do + if child.name == name then return child; end + end +end + +function stanza_mt.__tostring(t) + local children_text = ""; + for n, child in ipairs(t) do + children_text = children_text .. tostring(child); + end + + local attr_string = ""; + if t.attr then + for k, v in pairs(t.attr) do attr_string = attr_string .. format(" %s='%s'", k, tostring(v)); end + end + + return format("<%s%s>%s</%s>", t.name, attr_string, children_text, t.name); +end + +function stanza_mt.__add(s1, s2) + return s:add_child(s2); +end + + +do + local id = 0; + function new_id() + id = id + 1; + return "lx"..id; + end +end + +function message(attr, body) + if not body then + return stanza("message", attr); + else + return stanza("message", attr):tag("body"):text(body); + end +end +function iq(attr) + if attr and not attr.id then attr.id = new_id(); end + return stanza("iq", attr or { id = new_id() }); +end + +function reply(orig) + return stanza(orig.name, orig.attr and { to = orig.attr.from, from = orig.attr.to, id = orig.attr.id, type = ((orig.name == "iq" and "result") or nil) }); +end + +function presence(attr) + return stanza("presence", attr); +end + |