|
|
| Строка 1: |
Строка 1: |
| local p = {}
| |
|
| |
|
| local function split(s, sep)
| |
| if s == nil then return {} end
| |
| local parts = {}
| |
| sep = sep or "%."
| |
| for part in string.gmatch(s, "([^" .. sep .. "]+)") do
| |
| table.insert(parts, part)
| |
| end
| |
| return parts
| |
| end
| |
|
| |
| local function parse_indexed_part(part)
| |
| local key, idx = string.match(part, "^(.-)%[(%d+)%]$")
| |
| if key then
| |
| return key, tonumber(idx)
| |
| end
| |
| local num = tonumber(part)
| |
| if num then
| |
| return nil, num
| |
| end
| |
| return part, nil
| |
| end
| |
|
| |
| local function get_by_path(tbl, path)
| |
| if not tbl then return nil end
| |
| local parts = split(path, "%.")
| |
| local cur = tbl
| |
| for _, part in ipairs(parts) do
| |
| local key, idx = parse_indexed_part(part)
| |
| if key and key ~= "" then
| |
| local nextCur = nil
| |
| if type(cur) == "table" then
| |
| nextCur = cur[key]
| |
| if nextCur == nil then
| |
| nextCur = cur["!type:" .. key]
| |
| end
| |
| end
| |
| cur = nextCur
| |
| end
| |
| if idx then
| |
| if type(cur) ~= "table" then
| |
| return nil
| |
| end
| |
| cur = cur[idx]
| |
| end
| |
| if cur == nil then
| |
| return nil
| |
| end
| |
| end
| |
| return cur
| |
| end
| |
|
| |
| local function is_array(t)
| |
| if type(t) ~= "table" then return false end
| |
| local i = 0
| |
| for _ in pairs(t) do
| |
| i = i + 1
| |
| end
| |
| local n = 0
| |
| for k in pairs(t) do
| |
| if type(k) ~= "number" then
| |
| return false
| |
| end
| |
| if k > n then n = k end
| |
| end
| |
| return n > 0
| |
| end
| |
|
| |
| local function format_value(v)
| |
| if v == nil then return "" end
| |
| local t = type(v)
| |
| if t == "string" or t == "number" or t == "boolean" then
| |
| return tostring(v)
| |
| elseif t == "table" then
| |
| if is_array(v) then
| |
| local out = {}
| |
| local max = 0
| |
| for k in pairs(v) do if type(k) == "number" and k > max then max = k end end
| |
| for i = 1, max do
| |
| table.insert(out, format_value(v[i]))
| |
| end
| |
| return table.concat(out, ", ")
| |
| else
| |
| local out = {}
| |
| for k, val in pairs(v) do
| |
| table.insert(out, tostring(k) .. ": " .. format_value(val))
| |
| end
| |
| return table.concat(out, ", ")
| |
| end
| |
| else
| |
| return tostring(v)
| |
| end
| |
| end
| |
|
| |
| function p.get(frame)
| |
| local args = frame.args or {}
| |
| local id = args[1] or ""
| |
| local pagePath = args[2] or ""
| |
| local keyPath = args[3] or ""
| |
|
| |
| local baseUser = "IanComradeBot/"
| |
| local moduleName = "Module:" .. baseUser .. pagePath .. "/data"
| |
|
| |
| local ok, data = pcall(mw.loadData, moduleName)
| |
| if not ok or not data then
| |
| return ""
| |
| end
| |
|
| |
| local entry = nil
| |
| if id ~= "" then
| |
| entry = data[id]
| |
| end
| |
| if entry == nil then
| |
| entry = data["default"]
| |
| end
| |
| if entry == nil then
| |
| return ""
| |
| end
| |
|
| |
| if keyPath == "" then
| |
| return format_value(entry)
| |
| end
| |
|
| |
| local value = get_by_path(entry, keyPath)
| |
| return format_value(value)
| |
| end
| |
|
| |
| function p.flattenComponent(frame)
| |
| local args = frame.args or {}
| |
| local id = args[1] or ""
| |
| local pagePath = args[2] or ""
| |
| if id == "" or pagePath == "" then return "" end
| |
|
| |
| local baseUser = "IanComradeBot/"
| |
| local moduleName = "Module:" .. baseUser .. pagePath .. "/data"
| |
| local ok, data = pcall(mw.loadData, moduleName)
| |
| if not ok or not data then
| |
| return ""
| |
| end
| |
|
| |
| local entry = data[id] or data["default"] or {}
| |
|
| |
| local flat = {}
| |
| local function walk(tbl, prefix)
| |
| if type(tbl) ~= "table" then
| |
| flat[prefix] = format_value(tbl)
| |
| return
| |
| end
| |
| if is_array(tbl) then
| |
| local max = 0
| |
| for k in pairs(tbl) do if type(k) == "number" and k > max then max = k end end
| |
| for i = 1, max do
| |
| local v = tbl[i]
| |
| local key = (prefix == "" and tostring(i) or prefix .. "." .. tostring(i))
| |
| if type(v) == "table" then
| |
| walk(v, key)
| |
| else
| |
| flat[key] = format_value(v)
| |
| end
| |
| end
| |
| else
| |
| for k, v in pairs(tbl) do
| |
| local key = (prefix == "" and tostring(k) or prefix .. "." .. tostring(k))
| |
| if type(v) == "table" then
| |
| walk(v, key)
| |
| else
| |
| flat[key] = format_value(v)
| |
| end
| |
| end
| |
| end
| |
| end
| |
|
| |
| walk(entry, "")
| |
|
| |
| local parts = {}
| |
| for k, v in pairs(flat) do
| |
| table.insert(parts, tostring(k) .. "=" .. tostring(v))
| |
| end
| |
| return table.concat(parts, "|")
| |
| end
| |
|
| |
| return p
| |