X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Fstanza.lua;h=28e26e0a407232701ce7b2bdc8af0efa41e473e3;hb=fb812de36f5f7ae98eefa52640345565f5562223;hp=08ef2c9aa1649deac35eca8fd38488e7982a5372;hpb=4643eae0bf41b461c9337bfb66f9ac80f7e84f11;p=prosody.git diff --git a/util/stanza.lua b/util/stanza.lua index 08ef2c9a..28e26e0a 100644 --- a/util/stanza.lua +++ b/util/stanza.lua @@ -122,10 +122,26 @@ function stanza_mt:children() local i = 0; return function (a) i = i + 1 - local v = a[i] - if v then return v; end + return a[i]; end, self, i; end + +function stanza_mt:matching_tags(name, xmlns) + xmlns = xmlns or self.attr.xmlns; + local tags = self.tags; + local start_i, max_i = 1, #tags; + return function () + for i=start_i,max_i do + v = tags[i]; + if (not name or v.name == name) + and (not xmlns or xmlns == v.attr.xmlns) then + start_i = i+1; + return v; + end + end + end, tags, i; +end + function stanza_mt:childtags() local i = 0; return function (a) @@ -135,6 +151,30 @@ function stanza_mt:childtags() end, self.tags[1], i; end +function stanza_mt:maptags(callback) + local tags, curr_tag = self.tags, 1; + local n_children, n_tags = #self, #tags; + + local i = 1; + while curr_tag <= n_tags do + if self[i] == tags[curr_tag] then + local ret = callback(self[i]); + if ret == nil then + t_remove(self, i); + t_remove(tags, curr_tag); + n_children = n_children - 1; + n_tags = n_tags - 1; + else + self[i] = ret; + tags[i] = ret; + end + i = i + 1; + curr_tag = curr_tag + 1; + end + end + return self; +end + local xml_escape do local escape_table = { ["'"] = "'", ["\""] = """, ["<"] = "<", [">"] = ">", ["&"] = "&" }; @@ -303,7 +343,7 @@ function message(attr, body) if not body then return stanza("message", attr); else - return stanza("message", attr):tag("body"):text(body); + return stanza("message", attr):tag("body"):text(body):up(); end end function iq(attr)