scansion/objects/client.lua

changeset 46
d711bf1e9979
parent 44
0dab1dc183c1
parent 38
68458d0c50a0
child 48
6450aea6c564
--- a/scansion/objects/client.lua	Tue Oct 27 23:09:08 2015 +0000
+++ b/scansion/objects/client.lua	Tue Oct 27 23:14:19 2015 +0000
@@ -7,22 +7,29 @@
 
 local stanzacmp = require "scansion.stanzacmp";
 
+local function filter_expression(script, s)
+	local expr = s:match("^%$%{(.+)%}$");
+	if not expr then return s end
+	local name, value_name = expr:match("^(.+)'s (.+)$");
+	assert(name, "Unable to parse expression: "..expr);
+	local key = value_name:lower():gsub(" ", "_");
+	assert(script.objects[name], "Unknown object called "..name);
+	local value = script.objects[name][key];
+	assert(value ~= nil, "Unknown attribute (of "..name.."): "..value_name);
+	return value;
+end
+
 local function fill_vars(script, stanza)
 	for k, v in pairs(stanza.attr) do
-		local expr = v:match("^%$%{(.+)%}$");
-		if expr then
-			local name, value_name = expr:match("^(.+)'s (.+)$");
-			assert(name, "Unable to parse expression: "..expr);
-			local key = value_name:lower():gsub(" ", "_");
-			assert(script.objects[name], "Unknown object called "..name);
-			local value = script.objects[name][key];
-			assert(value ~= nil, "Unknown attribute (of "..name.."): "..value_name);
-			stanza.attr[k] = value;
+		stanza.attr[k] = filter_expression(script, v);
+	end
+	for i, child in ipairs(stanza) do
+		if type(child) == "string" then
+			stanza[i] = filter_expression(script, child);
+		elseif type(child) == "table" then
+			fill_vars(script, child);
 		end
 	end
-	for _, child in ipairs(stanza.tags) do
-		fill_vars(script, child);
-	end
 	return stanza;
 end
 

mercurial