Software / code / prosody
Comparison
util/stanza.lua @ 2077:e33658f6052c
Changed separator between attribute names and prefixes from '|' to '\1' (optimization and cleanup).
| author | Waqas Hussain <waqas20@gmail.com> |
|---|---|
| date | Thu, 12 Nov 2009 13:42:44 +0500 |
| parent | 1984:f2b1f89e1d7c |
| child | 2264:49580a13f71e |
comparison
equal
deleted
inserted
replaced
| 2076:de2ae849b0b3 | 2077:e33658f6052c |
|---|---|
| 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 |