Модуль:GetField: различия между версиями
Pok (обсуждение | вклад) Нет описания правки |
Pok (обсуждение | вклад) Нет описания правки |
||
| Строка 36: | Строка 36: | ||
end | end | ||
return cur | return cur | ||
end | end | ||
| Строка 71: | Строка 57: | ||
local out = {} | local out = {} | ||
for i = 1, max do | for i = 1, max do | ||
out[#out+1] = format_value(v[i]) | out[#out + 1] = format_value(v[i]) | ||
end | end | ||
return table.concat(out, ", ") | return table.concat(out, ", ") | ||
| Строка 77: | Строка 63: | ||
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) | out[#out + 1] = tostring(k) .. ": " .. format_value(val) | ||
end | end | ||
return table.concat(out, ", ") | return table.concat(out, ", ") | ||
| Строка 86: | Строка 72: | ||
end | end | ||
function p. | function p.findInPrototype(frame) | ||
local args = frame.args or {} | local args = frame.args or {} | ||
local | local searchId = args[1] or "" | ||
local | local protoId = args[2] or "" | ||
if | if searchId == "" or protoId == "" then | ||
return "[]" | |||
end | |||
local moduleName = "Module:IanComradeBot/prototype.json/data" | |||
local moduleName = "Module: | |||
local data = cache[moduleName] | local data = cache[moduleName] | ||
if not data then | if not data then | ||
local ok, loaded = pcall(mw.loadData, moduleName) | local ok, loaded = pcall(mw.loadData, moduleName) | ||
if not ok or not loaded then return "" end | if not ok or not loaded then | ||
return "[]" | |||
end | |||
data = loaded | data = loaded | ||
cache[moduleName] = data | cache[moduleName] = data | ||
end | end | ||
local | local proto = data[protoId] | ||
if type(proto) ~= "table" then | |||
if | return "[]" | ||
end | end | ||
if | local foundFields = {} | ||
for fieldName, value in pairs(proto) do | |||
local matched = false | |||
local t = type(value) | |||
if t == "string" then | |||
if value == searchId then | |||
matched = true | |||
end | |||
elseif t == "table" then | |||
for _, v in ipairs(value) do | |||
if v == searchId then | |||
matched = true | |||
break | |||
end | |||
end | |||
end | |||
if matched then | |||
table.insert(foundFields, fieldName) | |||
end | |||
end | end | ||
return mw.text.jsonEncode(foundFields) | |||
return | |||
end | end | ||
| Строка 145: | Строка 146: | ||
local function walk(tbl, prefix) | local function walk(tbl, prefix) | ||
local keys = {} | local keys = {} | ||
for k in pairs(tbl) do keys[#keys+1] = k end | 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 | ||
| Строка 153: | Строка 154: | ||
walk(v, key) | walk(v, key) | ||
else | else | ||
parts[#parts+1] = key .. "=" .. tostring(v) | parts[#parts + 1] = key .. "=" .. tostring(v) | ||
end | end | ||
end | end | ||
| Строка 160: | Строка 161: | ||
walk(entry, "") | walk(entry, "") | ||
return table.concat(parts, "|") | return table.concat(parts, "|") | ||
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 "" | |||
if pagePath == "" then return "" end | |||
local baseUser = "IanComradeBot/" | |||
local moduleName = "Module:" .. baseUser .. pagePath .. "/data" | |||
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 entryKey = moduleName .. "|" .. (id ~= "" and id or "default") | |||
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 | |||
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.getTpl(frame) | |||
local args = frame.args or {} | |||
local id = args[1] or "" | |||
local pagePath = args[2] or "" | |||
local tplPath = args[3] or "" | |||
if id == "" or pagePath == "" or tplPath == "" then | |||
return "" | |||
end | |||
local extra = p.flattenField({ args = { id, pagePath } }) or "" | |||
local tplStr = "{{" .. tostring(tplPath) .. "|id=" .. tostring(id) | |||
if extra ~= "" then | |||
tplStr = tplStr .. "|" .. extra | |||
end | |||
tplStr = tplStr .. "}}" | |||
return tplStr | |||
end | |||
function p.getTplProto(frame) | |||
local args = frame.args or {} | |||
local searchId = args[1] or "" | |||
local protoId = args[2] or "" | |||
local tplPath = args[4] or "" | |||
if searchId == "" or protoId == "" or tplPath == "" then | |||
return "" | |||
end | |||
local fieldsJson = p.findInPrototype({ args = { searchId, protoId } }) | |||
local ok, fields = pcall(mw.text.jsonDecode, fieldsJson or "") | |||
if not ok or type(fields) ~= "table" or #fields == 0 then | |||
return "" | |||
end | |||
local out = {} | |||
for _ = 1, #fields do | |||
local tpl = p.getTpl({ args = { searchId, protoId, tplPath } }) | |||
if tpl ~= "" then | |||
out[#out + 1] = tpl | |||
end | |||
end | |||
return table.concat(out, "\n") | |||
end | end | ||
return p | return p | ||