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