Thu, 23 Mar 2023 15:30:32 +0000
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; };