Software / code / prosody
Comparison
util/stanza.lua @ 1431:9fe9ba693f4a
util.stanza: Serializer optimizations, and nicer output for empty elements
| author | Waqas Hussain <waqas20@gmail.com> |
|---|---|
| date | Sat, 27 Jun 2009 08:38:52 +0500 |
| parent | 1420:1576a5aa52f8 |
| child | 1517:22be7637a64d |
comparison
equal
deleted
inserted
replaced
| 1430:39169cf8d36f | 1431:9fe9ba693f4a |
|---|---|
| 22 local next = next; | 22 local next = next; |
| 23 local print = print; | 23 local print = print; |
| 24 local unpack = unpack; | 24 local unpack = unpack; |
| 25 local s_gsub = string.gsub; | 25 local s_gsub = string.gsub; |
| 26 local s_char = string.char; | 26 local s_char = string.char; |
| 27 local s_find = string.find; | |
| 27 local os = os; | 28 local os = os; |
| 28 | 29 |
| 29 local do_pretty_printing = not os.getenv("WINDIR"); | 30 local do_pretty_printing = not os.getenv("WINDIR"); |
| 30 local getstyle, getstring = require "util.termcolours".getstyle, require "util.termcolours".getstring; | 31 local getstyle, getstring = require "util.termcolours".getstyle, require "util.termcolours".getstring; |
| 31 | 32 |
| 120 local xml_escape = (function() | 121 local xml_escape = (function() |
| 121 local escape_table = { ["'"] = "'", ["\""] = """, ["<"] = "<", [">"] = ">", ["&"] = "&" }; | 122 local escape_table = { ["'"] = "'", ["\""] = """, ["<"] = "<", [">"] = ">", ["&"] = "&" }; |
| 122 return function(str) return (s_gsub(str, "['&<>\"]", escape_table)); end | 123 return function(str) return (s_gsub(str, "['&<>\"]", escape_table)); end |
| 123 end)(); | 124 end)(); |
| 124 local function _dostring(t, buf, self, xml_escape) | 125 local function _dostring(t, buf, self, xml_escape) |
| 125 local nsid, ns, attrk = 0; | 126 local nsid = 0; |
| 126 t_insert(buf, "<"..t.name); | 127 local name = t.name |
| 128 t_insert(buf, "<"..name); | |
| 127 for k, v in pairs(t.attr) do | 129 for k, v in pairs(t.attr) do |
| 128 ns, attrk = s_match(k, "^([^|]+)|(.+)$"); | 130 if s_find(k, "|", 1, true) then |
| 129 if ns then | 131 local ns, attrk = s_match(k, "^([^|]+)|(.+)$"); |
| 130 nsid = nsid + 1; | 132 nsid = nsid + 1; |
| 131 t_insert(buf, " xmlns:ns"..nsid.."='"..xml_escape(ns).."' ".."ns"..nsid..":"..attrk.."='"..xml_escape(v).."'"); | 133 t_insert(buf, " xmlns:ns"..nsid.."='"..xml_escape(ns).."' ".."ns"..nsid..":"..attrk.."='"..xml_escape(v).."'"); |
| 132 else | 134 else |
| 133 t_insert(buf, " "..k.."='"..xml_escape(v).."'"); | 135 t_insert(buf, " "..k.."='"..xml_escape(v).."'"); |
| 134 end | 136 end |
| 135 end | 137 end |
| 136 t_insert(buf, ">"); | 138 local len = #t; |
| 137 for n=1,#t do | 139 if len == 0 then |
| 138 local child = t[n]; | 140 t_insert(buf, "/>"); |
| 139 if child.name then | 141 else |
| 140 self(child, buf, self, xml_escape); | 142 t_insert(buf, ">"); |
| 141 else | 143 for n=1,len do |
| 142 t_insert(buf, xml_escape(child)); | 144 local child = t[n]; |
| 143 end | 145 if child.name then |
| 144 end | 146 self(child, buf, self, xml_escape); |
| 145 t_insert(buf, "</"..t.name..">"); | 147 else |
| 148 t_insert(buf, xml_escape(child)); | |
| 149 end | |
| 150 end | |
| 151 t_insert(buf, "</"..name..">"); | |
| 152 end | |
| 146 end | 153 end |
| 147 function stanza_mt.__tostring(t) | 154 function stanza_mt.__tostring(t) |
| 148 local buf = {}; | 155 local buf = {}; |
| 149 _dostring(t, buf, _dostring, xml_escape); | 156 _dostring(t, buf, _dostring, xml_escape); |
| 150 return t_concat(buf); | 157 return t_concat(buf); |