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