From 641c767e50adb47531f69b4e62ce8f764c63cabe Mon Sep 17 00:00:00 2001 From: Robert Jelic <36573031+NoryiE@users.noreply.github.com> Date: Wed, 12 Mar 2025 00:41:50 +0100 Subject: [PATCH] Fixed xml scope access --- src/elements/BaseFrame.lua | 1 - src/plugins/xml.lua | 41 +++++++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/elements/BaseFrame.lua b/src/elements/BaseFrame.lua index a1c7a27..7c6fd30 100644 --- a/src/elements/BaseFrame.lua +++ b/src/elements/BaseFrame.lua @@ -169,5 +169,4 @@ function BaseFrame:render() end end - return BaseFrame \ No newline at end of file diff --git a/src/plugins/xml.lua b/src/plugins/xml.lua index 0baaac8..4bc7086 100644 --- a/src/plugins/xml.lua +++ b/src/plugins/xml.lua @@ -74,19 +74,43 @@ local XMLParser = { end } -local log = require("log").debug +local function findExpressions(text) + local expressions = {} + local lastIndex = 1 + + while true do + local startPos, endPos, expr = text:find("%${([^}]+)}", lastIndex) + if not startPos then break end + + table.insert(expressions, { + start = startPos, + ending = endPos, + expression = expr, + raw = text:sub(startPos, endPos) + }) + + lastIndex = endPos + 1 + end + + return expressions +end local function convertValue(value, scope) if value:sub(1,1) == "\"" and value:sub(-1) == "\"" then value = value:sub(2, -2) end - if value:sub(1,2) == "${" and value:sub(-1) == "}" then - value = value:sub(3, -2) - if(scope[value])then - return scope[value] + local expressions = findExpressions(value) + + for _, expr in ipairs(expressions) do + local expression = expr.expression + local startPos = expr.start - 1 + local endPos = expr.ending + 1 + + if scope[expression] then + value = value:sub(1, startPos) .. tostring(scope[expression]) .. value:sub(endPos) else - errorManager.error("XMLParser: variable '" .. value .. "' not found in scope") + errorManager.error("XMLParser: variable '" .. expression .. "' not found in scope") end end @@ -154,9 +178,12 @@ function BaseElement:fromXML(node, scope) if(k:sub(1,2)=="on")then local val = v:gsub("\"", "") if(scope[val])then + if(type(scope[val]) ~= "function")then + errorManager.error("XMLParser: variable '" .. val .. "' is not a function for element '" .. self:getType() .. "' "..k) + end self[k](self, scope[val]) else - errorManager.error("XMLParser: variable '" .. v .. "' not found in scope") + errorManager.error("XMLParser: variable '" .. val .. "' not found in scope") end else errorManager.error("XMLParser: property '" .. k .. "' not found in element '" .. self:getType() .. "'")