1 local t_insert = table.insert; |
1 local t_insert = table.insert; |
2 local t_remove = table.remove; |
2 local t_remove = table.remove; |
3 local format = string.format; |
3 local format = string.format; |
4 local tostring = tostring; |
4 local tostring = tostring; |
5 local setmetatable= setmetatable; |
5 local setmetatable = setmetatable; |
6 local pairs = pairs; |
6 local pairs = pairs; |
7 local ipairs = ipairs; |
7 local ipairs = ipairs; |
|
8 local type = type; |
8 |
9 |
9 module "stanza" |
10 module "stanza" |
10 |
11 |
11 stanza_mt = {}; |
12 stanza_mt = {}; |
12 stanza_mt.__index = stanza_mt; |
13 stanza_mt.__index = stanza_mt; |
13 |
14 |
14 function stanza(name, attr) |
15 function stanza(name, attr) |
15 local stanza = { name = name, attr = attr or {}, last_add = {}}; |
16 local stanza = { name = name, attr = attr or {}, tags = {}, last_add = {}}; |
16 return setmetatable(stanza, stanza_mt); |
17 return setmetatable(stanza, stanza_mt); |
17 end |
18 end |
18 |
19 |
19 function stanza_mt:iq(attrs) |
20 function stanza_mt:iq(attrs) |
20 return self + stanza("iq", attrs) |
21 return self + stanza("iq", attrs) |
44 t_remove(self.last_add); |
45 t_remove(self.last_add); |
45 return self; |
46 return self; |
46 end |
47 end |
47 |
48 |
48 function stanza_mt:add_child(child) |
49 function stanza_mt:add_child(child) |
|
50 if type(child) == "table" then |
|
51 t_insert(self.tags, child); |
|
52 end |
49 t_insert(self, child); |
53 t_insert(self, child); |
50 end |
54 end |
51 |
55 |
52 function stanza_mt:child_with_name(name) |
56 function stanza_mt:child_with_name(name) |
53 for _, child in ipairs(self) do |
57 for _, child in ipairs(self) do |
54 if child.name == name then return child; end |
58 if child.name == name then return child; end |
55 end |
59 end |
|
60 end |
|
61 |
|
62 function stanza_mt:children() |
|
63 local i = 0; |
|
64 return function (a) |
|
65 i = i + 1 |
|
66 local v = a[i] |
|
67 if v then return v; end |
|
68 end, self, i; |
|
69 |
56 end |
70 end |
57 |
71 |
58 function stanza_mt.__tostring(t) |
72 function stanza_mt.__tostring(t) |
59 local children_text = ""; |
73 local children_text = ""; |
60 for n, child in ipairs(t) do |
74 for n, child in ipairs(t) do |
61 children_text = children_text .. tostring(child); |
75 children_text = children_text .. tostring(child); |
62 end |
76 end |
63 |
77 |
64 local attr_string = ""; |
78 local attr_string = ""; |
65 if t.attr then |
79 if t.attr then |
66 for k, v in pairs(t.attr) do attr_string = attr_string .. format(" %s='%s'", k, tostring(v)); end |
80 for k, v in pairs(t.attr) do if type(k) == "string" then attr_string = attr_string .. format(" %s='%s'", k, tostring(v)); end end |
67 end |
81 end |
68 |
82 |
69 return format("<%s%s>%s</%s>", t.name, attr_string, children_text, t.name); |
83 return format("<%s%s>%s</%s>", t.name, attr_string, children_text, t.name); |
70 end |
84 end |
71 |
85 |
72 function stanza_mt.__add(s1, s2) |
86 function stanza_mt.__add(s1, s2) |
73 return s:add_child(s2); |
87 return s1:add_child(s2); |
74 end |
88 end |
75 |
89 |
76 |
90 |
77 do |
91 do |
78 local id = 0; |
92 local id = 0; |