|
|
| (не показаны 2 промежуточные версии этого же участника) |
| Строка 1: |
Строка 1: |
| local p = {} | | local p = {} |
|
| |
|
| local function split(s, sep) | | local data = mw.loadData('Module:Песочница/Pok/3') |
| 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 function key() |
| local key, idx = string.match(part, "^(.-)%[(%d+)%]$")
| | local t = mw.title.getCurrentTitle() |
| if key then
| | return t and t.prefixedText or nil |
| return key, tonumber(idx)
| |
| end
| |
| local num = tonumber(part)
| |
| if num then
| |
| return nil, num
| |
| end
| |
| return part, nil
| |
| end | | end |
|
| |
|
| local function get_by_path(tbl, path)
| | function p.set(frame) |
| if not tbl then return nil end
| | local args = frame.args or {} |
| local parts = split(path, "%.")
| | local v = args.path or args[1] or args.base or "" |
| local cur = tbl
| | v = mw.text.trim(tostring(v or "")) |
| for _, part in ipairs(parts) do
| | local k = key() |
| local key, idx = parse_indexed_part(part)
| | if k and v ~= "" then |
| if key and key ~= "" then
| | data[k] = v |
| local nextCur = nil
| | end |
| if type(cur) == "table" then
| | return "" |
| 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 | | end |
|
| |
|
| local function is_array(t)
| | function p.get() |
| if type(t) ~= "table" then return false end
| | local k = key() |
| local i = 0
| | if not k then return nil end |
| for _ in pairs(t) do
| | return data[k] |
| 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 | | end |
|
| |
|
| return p | | return p |
Для документации этого модуля может быть создана страница Модуль:Песочница/Pok/2/doc
local p = {}
local data = mw.loadData('Module:Песочница/Pok/3')
local function key()
local t = mw.title.getCurrentTitle()
return t and t.prefixedText or nil
end
function p.set(frame)
local args = frame.args or {}
local v = args.path or args[1] or args.base or ""
v = mw.text.trim(tostring(v or ""))
local k = key()
if k and v ~= "" then
data[k] = v
end
return ""
end
function p.get()
local k = key()
if not k then return nil end
return data[k]
end
return p