|
|
| (не показаны 23 промежуточные версии этого же участника) |
| Строка 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
| |
|
| |
| return p
| |