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); |