Модуль:GetField: различия между версиями
Pok (обсуждение | вклад) мНет описания правки Метка: ручная отмена |
Pok (обсуждение | вклад) Нет описания правки |
||
| Строка 1: | Строка 1: | ||
local p = {} | local p = {} | ||
local | local cache = {} | ||
local entryCache = {} | |||
local function parse_indexed_part(part) | local function parse_indexed_part(part) | ||
| Строка 24: | Строка 17: | ||
local function get_by_path(tbl, path) | local function get_by_path(tbl, path) | ||
if not tbl then return nil end | if not tbl or path == "" then return nil end | ||
local cur = tbl | local cur = tbl | ||
for | for part in string.gmatch(path, "([^%.]+)") do | ||
local key, idx = parse_indexed_part(part) | local key, idx = parse_indexed_part(part) | ||
if key and key ~= "" then | if key and key ~= "" then | ||
if type(cur) ~= "table" then return nil end | |||
if type(cur) | local nextCur = cur[key] | ||
if nextCur == nil then | |||
nextCur = cur["!type:" .. key] | |||
end | end | ||
cur = nextCur | cur = nextCur | ||
end | end | ||
if idx then | if idx then | ||
if type(cur) ~= "table" then | if type(cur) ~= "table" then return nil end | ||
cur = cur[idx] | cur = cur[idx] | ||
end | end | ||
if cur == nil then | if cur == nil then return nil end | ||
end | end | ||
return cur | return cur | ||
| Строка 54: | Строка 40: | ||
local function is_array(t) | local function is_array(t) | ||
if type(t) ~= "table" then return false end | if type(t) ~= "table" then return false end | ||
local | local max = 0 | ||
local count = 0 | |||
local | |||
for k in pairs(t) do | for k in pairs(t) do | ||
if type(k) ~= "number" then | if type(k) ~= "number" then | ||
return false | return false | ||
end | end | ||
if k > | count = count + 1 | ||
if k > max then max = k end | |||
end | end | ||
return | return max > 0 | ||
end | end | ||
| Строка 74: | Строка 58: | ||
return tostring(v) | return tostring(v) | ||
elseif t == "table" then | elseif t == "table" then | ||
if | local max = 0 | ||
local hasNonNumber = false | |||
for k in pairs(v) do | |||
if type(k) ~= "number" then | |||
hasNonNumber = true | |||
break | |||
else | |||
if k > max then max = k end | |||
end | |||
end | |||
if not hasNonNumber and max > 0 then | |||
local out = {} | local out = {} | ||
for i = 1, max do | for i = 1, max do | ||
out[#out+1] = format_value(v[i]) | |||
end | end | ||
return table.concat(out, ", ") | return table.concat(out, ", ") | ||
| Строка 85: | Строка 77: | ||
local out = {} | local out = {} | ||
for k, val in pairs(v) do | for k, val in pairs(v) do | ||
out[#out+1] = tostring(k) .. ": " .. format_value(val) | |||
end | end | ||
return table.concat(out, ", ") | return table.concat(out, ", ") | ||
| Строка 99: | Строка 91: | ||
local pagePath = args[2] or "" | local pagePath = args[2] or "" | ||
local keyPath = args[3] or "" | local keyPath = args[3] or "" | ||
if pagePath == "" then return "" end | |||
local baseUser = "IanComradeBot/" | local baseUser = "IanComradeBot/" | ||
local moduleName = "Module:" .. baseUser .. pagePath .. "/data" | local moduleName = "Module:" .. baseUser .. pagePath .. "/data" | ||
local ok, | local data = cache[moduleName] | ||
if not data then | |||
local ok, loaded = pcall(mw.loadData, moduleName) | |||
if not ok or not loaded then return "" end | |||
data = loaded | |||
cache[moduleName] = data | |||
end | end | ||
local entry = | local entryKey = moduleName .. "|" .. (id ~= "" and id or "default") | ||
if id ~= "" then | local entry = entryCache[entryKey] | ||
if not entry then | |||
if id ~= "" then entry = data[id] end | |||
if entry == nil then entry = data["default"] end | |||
entryCache[entryKey] = entry | |||
end | end | ||
if entry == nil then return "" end | |||
if keyPath == "" then | if keyPath == "" then | ||
| Строка 135: | Строка 130: | ||
local baseUser = "IanComradeBot/" | local baseUser = "IanComradeBot/" | ||
local moduleName = "Module:" .. baseUser .. pagePath .. "/data" | local moduleName = "Module:" .. baseUser .. pagePath .. "/data" | ||
local ok, | |||
local data = cache[moduleName] | |||
if not data then | |||
local ok, loaded = pcall(mw.loadData, moduleName) | |||
if not ok or not loaded then return "" end | |||
data = loaded | |||
cache[moduleName] = data | |||
end | |||
local entry = data[id] or data["default"] or {} | local entry = data[id] or data["default"] or {} | ||
if type(entry) ~= "table" then | if type(entry) ~= "table" then return "" end | ||
local parts = {} | local parts = {} | ||
local function walk(tbl, prefix) | local function walk(tbl, prefix) | ||
local keys = {} | local keys = {} | ||
for k in pairs(tbl) do | for k in pairs(tbl) do keys[#keys+1] = k end | ||
table.sort(keys, function(a, b) return tostring(a) < tostring(b) end) | table.sort(keys, function(a, b) return tostring(a) < tostring(b) end) | ||
for _, k in ipairs(keys) do | for _, k in ipairs(keys) do | ||
| Строка 154: | Строка 153: | ||
walk(v, key) | walk(v, key) | ||
else | else | ||
parts[#parts+1] = key .. "=" .. tostring(v) | |||
end | end | ||
end | end | ||