scansion/helpers.lua

changeset 171
433a1f36d0d3
child 173
14ed4cb241f4
--- /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;
+};

mercurial