Thu, 23 Mar 2023 15:09:10 +0000
scansion: Support for per-script captures
local function filter_expression(script, s) local expr = s:match("^%$%{(.+)%}$"); if not expr then return s end if script.captures and script.captures[expr] then return script.captures[expr]; 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; };