Comparison

util/template.lua @ 4495:c0f5c78cb817

util.template: Refactoring to make the string->stanza conversion code more generic.
author Waqas Hussain <waqas20@gmail.com>
date Sun, 05 Feb 2012 00:06:20 +0500
parent 3640:4bc88bb748d1
child 5214:1430c6f36621
comparison
equal deleted inserted replaced
4494:694491140a67 4495:c0f5c78cb817
5 local pairs = pairs; 5 local pairs = pairs;
6 local ipairs = ipairs; 6 local ipairs = ipairs;
7 local error = error; 7 local error = error;
8 local loadstring = loadstring; 8 local loadstring = loadstring;
9 local debug = debug; 9 local debug = debug;
10 local t_remove = table.remove;
10 11
11 module("template") 12 module("template")
12 13
13 local parse_xml = (function() 14 local parse_xml = (function()
14 local ns_prefixes = { 15 local ns_prefixes = {
40 end 41 end
41 end 42 end
42 stanza:tag(name, attr); 43 stanza:tag(name, attr);
43 end 44 end
44 function handler:CharacterData(data) 45 function handler:CharacterData(data)
45 data = data:gsub("^%s*", ""):gsub("%s*$", "");
46 stanza:text(data); 46 stanza:text(data);
47 end 47 end
48 function handler:EndElement(tagname) 48 function handler:EndElement(tagname)
49 stanza:up(); 49 stanza:up();
50 end 50 end
57 else 57 else
58 return ok, err.." (line "..line..", col "..col..")"; 58 return ok, err.." (line "..line..", col "..col..")";
59 end 59 end
60 end; 60 end;
61 end)(); 61 end)();
62
63 local function trim_xml(stanza)
64 for i=#stanza,1,-1 do
65 local child = stanza[i];
66 if child.name then
67 trim_xml(child);
68 else
69 child = child:gsub("^%s*", ""):gsub("%s*$", "");
70 stanza[i] = child;
71 if child == "" then t_remove(stanza, i); end
72 end
73 end
74 end
62 75
63 local function create_string_string(str) 76 local function create_string_string(str)
64 str = ("%q"):format(str); 77 str = ("%q"):format(str);
65 str = str:gsub("{([^}]*)}", function(s) 78 str = str:gsub("{([^}]*)}", function(s)
66 return '"..(data["'..s..'"]or"").."'; 79 return '"..(data["'..s..'"]or"").."';
116 129
117 local template_mt = { __tostring = function(t) return t.name end }; 130 local template_mt = { __tostring = function(t) return t.name end };
118 local function create_template(templates, text) 131 local function create_template(templates, text)
119 local stanza, err = parse_xml(text); 132 local stanza, err = parse_xml(text);
120 if not stanza then error(err); end 133 if not stanza then error(err); end
134 trim_xml(stanza);
121 135
122 local info = debug.getinfo(3, "Sl"); 136 local info = debug.getinfo(3, "Sl");
123 info = info and ("template(%s:%d)"):format(info.short_src:match("[^\\/]*$"), info.currentline) or "template(unknown)"; 137 info = info and ("template(%s:%d)"):format(info.short_src:match("[^\\/]*$"), info.currentline) or "template(unknown)";
124 138
125 local template = setmetatable({ apply = create_cloner(stanza, info), name = info, text = text }, template_mt); 139 local template = setmetatable({ apply = create_cloner(stanza, info), name = info, text = text }, template_mt);