--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scansion/helpers.lua Thu Mar 23 11:51:31 2023 +0000 @@ -0,0 +1,30 @@ +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 + 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 + return stanza; +end + +return { + filter_expression = filter_expression; + fill_vars = fill_vars; +};