scansion/helpers.lua

Thu, 23 Mar 2023 15:30:32 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Thu, 23 Mar 2023 15:30:32 +0000
changeset 178
e547ddf8b64d
parent 173
14ed4cb241f4
permissions
-rw-r--r--

Remove dependency on util.iterators

I mistakenly thought it was bundled with verse.

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

local function sorted_pairs(t, sort_func)
	local keys = {};
	for k in pairs(t) do table.insert(keys, k); end
	table.sort(keys, sort_func);
	local i = 0;
	return function ()
		i = i + 1;
		local key = keys[i];
		if key ~= nil then
			return key, t[key];
		end
	end;
end

return {
	filter_expression = filter_expression;
	fill_vars = fill_vars;
	sorted_pairs = sorted_pairs;
};

mercurial