134 local function _dostring(t, buf, self, xml_escape, parentns) |
134 local function _dostring(t, buf, self, xml_escape, parentns) |
135 local nsid = 0; |
135 local nsid = 0; |
136 local name = t.name |
136 local name = t.name |
137 t_insert(buf, "<"..name); |
137 t_insert(buf, "<"..name); |
138 for k, v in pairs(t.attr) do |
138 for k, v in pairs(t.attr) do |
139 if s_find(k, "|", 1, true) then |
139 if s_find(k, "\1", 1, true) then |
140 local ns, attrk = s_match(k, "^([^|]+)|(.+)$"); |
140 local ns, attrk = s_match(k, "^([^\1]*)\1?(.*)$"); |
141 nsid = nsid + 1; |
141 nsid = nsid + 1; |
142 t_insert(buf, " xmlns:ns"..nsid.."='"..xml_escape(ns).."' ".."ns"..nsid..":"..attrk.."='"..xml_escape(v).."'"); |
142 t_insert(buf, " xmlns:ns"..nsid.."='"..xml_escape(ns).."' ".."ns"..nsid..":"..attrk.."='"..xml_escape(v).."'"); |
143 elseif not(k == "xmlns" and v == parentns) then |
143 elseif not(k == "xmlns" and v == parentns) then |
144 t_insert(buf, " "..k.."='"..xml_escape(v).."'"); |
144 t_insert(buf, " "..k.."='"..xml_escape(v).."'"); |
145 end |
145 end |
146 end |
146 end |
147 local len = #t; |
147 local len = #t; |
148 if len == 0 then |
148 if len == 0 then |
150 else |
150 else |
151 t_insert(buf, ">"); |
151 t_insert(buf, ">"); |
152 for n=1,len do |
152 for n=1,len do |
153 local child = t[n]; |
153 local child = t[n]; |
154 if child.name then |
154 if child.name then |
155 self(child, buf, self, xml_escape, t.attr.xmlns); |
155 self(child, buf, self, xml_escape, t.attr.xmlns); |
156 else |
156 else |
157 t_insert(buf, xml_escape(child)); |
157 t_insert(buf, xml_escape(child)); |
158 end |
158 end |
159 end |
159 end |
160 t_insert(buf, "</"..name..">"); |
160 t_insert(buf, "</"..name..">"); |
161 end |
161 end |
162 end |
162 end |
163 function stanza_mt.__tostring(t) |
163 function stanza_mt.__tostring(t) |
164 local buf = {}; |
164 local buf = {}; |
165 _dostring(t, buf, _dostring, xml_escape, nil); |
165 _dostring(t, buf, _dostring, xml_escape, nil); |
166 return t_concat(buf); |
166 return t_concat(buf); |
167 end |
167 end |
168 |
168 |
169 function stanza_mt.top_tag(t) |
169 function stanza_mt.top_tag(t) |
170 local attr_string = ""; |
170 local attr_string = ""; |
208 function deserialize(stanza) |
208 function deserialize(stanza) |
209 -- Set metatable |
209 -- Set metatable |
210 if stanza then |
210 if stanza then |
211 local attr = stanza.attr; |
211 local attr = stanza.attr; |
212 for i=1,#attr do attr[i] = nil; end |
212 for i=1,#attr do attr[i] = nil; end |
|
213 local attrx = {}; |
|
214 for att in pairs(attr) do |
|
215 if s_find(att, "|", 1, true) and not s_find(k, "\1", 1, true) then |
|
216 local ns,na = s_match(k, "^([^|]+)|(.+)$"); |
|
217 attrx[ns.."\1"..na] = attr[att]; |
|
218 attr[att] = nil; |
|
219 end |
|
220 end |
|
221 for a,v in pairs(attrx) do |
|
222 attr[x] = v; |
|
223 end |
213 setmetatable(stanza, stanza_mt); |
224 setmetatable(stanza, stanza_mt); |
214 for _, child in ipairs(stanza) do |
225 for _, child in ipairs(stanza) do |
215 if type(child) == "table" then |
226 if type(child) == "table" then |
216 deserialize(child); |
227 deserialize(child); |
217 end |
228 end |