|
1 local function filter_expression(script, s) |
|
2 local expr = s:match("^%$%{(.+)%}$"); |
|
3 if not expr then return s end |
|
4 local name, value_name = expr:match("^(.+)'s (.+)$"); |
|
5 assert(name, "Unable to parse expression: "..expr); |
|
6 local key = value_name:lower():gsub(" ", "_"); |
|
7 assert(script.objects[name], "Unknown object called "..name); |
|
8 local value = script.objects[name][key]; |
|
9 assert(value ~= nil, "Unknown attribute (of "..name.."): "..value_name); |
|
10 return value; |
|
11 end |
|
12 |
|
13 local function fill_vars(script, stanza) |
|
14 for k, v in pairs(stanza.attr) do |
|
15 stanza.attr[k] = filter_expression(script, v); |
|
16 end |
|
17 for i, child in ipairs(stanza) do |
|
18 if type(child) == "string" then |
|
19 stanza[i] = filter_expression(script, child); |
|
20 elseif type(child) == "table" then |
|
21 fill_vars(script, child); |
|
22 end |
|
23 end |
|
24 return stanza; |
|
25 end |
|
26 |
|
27 return { |
|
28 filter_expression = filter_expression; |
|
29 fill_vars = fill_vars; |
|
30 }; |