scansion/helpers.lua

Thu, 23 Mar 2023 15:09:10 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Thu, 23 Mar 2023 15:09:10 +0000
changeset 173
14ed4cb241f4
parent 171
433a1f36d0d3
child 178
e547ddf8b64d
permissions
-rw-r--r--

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

mercurial