Модуль:GetField: различия между версиями
Pok (обсуждение | вклад) Нет описания правки |
Pok (обсуждение | вклад) мНет описания правки |
||
| (не показаны 3 промежуточные версии этого же участника) | |||
| Строка 3: | Строка 3: | ||
local cache = {} | local cache = {} | ||
local entryCache = {} | local entryCache = {} | ||
local BASE_USER = "IanComradeBot/" | |||
local function get_module_name(pagePath) | |||
return "Module:" .. BASE_USER .. pagePath .. "/data" | |||
end | |||
local function load_cached_data(moduleName) | |||
local data = cache[moduleName] | |||
if data then | |||
return data | |||
end | |||
local ok, loaded = pcall(mw.loadData, moduleName) | |||
if not ok or not loaded then | |||
return nil | |||
end | |||
cache[moduleName] = loaded | |||
return loaded | |||
end | |||
local function parse_indexed_part(part) | local function parse_indexed_part(part) | ||
| Строка 61: | Строка 81: | ||
local function to_nowiki(v) | local function to_nowiki(v) | ||
return "<nowiki>" .. v .. "</nowiki>" | |||
return "<nowiki>" .. | |||
end | end | ||
| Строка 133: | Строка 152: | ||
end | end | ||
return nil | return nil | ||
end | |||
local function contains_target(v, target) | |||
if type(v) == "table" then | |||
if is_array(v) then | |||
for _, item in ipairs(v) do | |||
if tostring(item) == target then | |||
return true | |||
end | |||
end | |||
return false | |||
end | |||
for _, item in pairs(v) do | |||
if tostring(item) == target then | |||
return true | |||
end | |||
end | |||
return false | |||
end | |||
return tostring(v) == target | |||
end | |||
local function find_matching_ids(idsTable, keyPath, searchValue) | |||
local target = tostring(searchValue) | |||
local matches = {} | |||
for idKey, entry in pairs(idsTable) do | |||
if type(entry) == "table" then | |||
local v = get_by_path(entry, keyPath) | |||
if v ~= nil and contains_target(v, target) then | |||
matches[#matches + 1] = idKey | |||
end | |||
end | |||
end | |||
return matches | |||
end | |||
local function preprocess_or_return(frame, text) | |||
if type(frame.preprocess) == "function" then | |||
return frame:preprocess(text) | |||
end | |||
return text | |||
end | |||
local function get_field_loose(entry, fieldId) | |||
local value = entry[fieldId] | |||
if value ~= nil then return value end | |||
if fieldId == "" then return nil end | |||
local first = string.sub(fieldId, 1, 1) | |||
local tail = string.sub(fieldId, 2) | |||
value = entry[string.lower(first) .. tail] | |||
if value ~= nil then return value end | |||
return entry[string.upper(first) .. tail] | |||
end | end | ||
| Строка 148: | Строка 225: | ||
end | end | ||
local | local storeName = (kind == "prototype") and "prototype_store.json" or "component_store.json" | ||
local moduleName = get_module_name(storeName) | |||
local data = load_cached_data(moduleName) | |||
local moduleName = | |||
local data = | |||
if not data then | if not data then | ||
return "" | |||
end | end | ||
| Строка 172: | Строка 237: | ||
end | end | ||
local value = entry | local value = get_field_loose(entry, fieldId) | ||
if value == nil then | if value == nil then | ||
return "" | return "" | ||
| Строка 196: | Строка 261: | ||
if id == "" or pagePath == "" then return "" end | if id == "" or pagePath == "" then return "" end | ||
local moduleName = get_module_name(pagePath) | |||
local moduleName = | local data = load_cached_data(moduleName) | ||
if not data then return "" end | |||
local data = | |||
if not data | |||
local entry = resolve_entry(data, id) or {} | local entry = resolve_entry(data, id) or {} | ||
| Строка 212: | Строка 270: | ||
local parts = {} | local parts = {} | ||
local function append_table_json(key, value) | |||
local ok, json = pcall(mw.text.jsonEncode, value) | |||
if ok and json then | |||
parts[#parts + 1] = key .. "=" .. to_nowiki(json) | |||
end | |||
end | |||
local function walk(tbl, prefix) | local function walk(tbl, prefix) | ||
local keys = {} | local keys = {} | ||
| Строка 218: | Строка 283: | ||
for _, k in ipairs(keys) do | for _, k in ipairs(keys) do | ||
local v = tbl[k] | local v = tbl[k] | ||
local key = (prefix == "" and | local kStr = tostring(k) | ||
local key = (prefix == "" and kStr or prefix .. "." .. kStr) | |||
if type(v) == "table" then | |||
if next(v) == nil then | |||
else | |||
append_table_json(key, v) | |||
if not is_array(v) then | |||
walk(v, key) | walk(v, key) | ||
end | end | ||
end | end | ||
else | |||
parts[#parts + 1] = key .. "=" .. tostring(v) | |||
end | end | ||
end | end | ||
| Строка 261: | Строка 312: | ||
if pagePath == "" then return "" end | if pagePath == "" then return "" end | ||
local moduleName = get_module_name(pagePath) | |||
local moduleName = | local data = load_cached_data(moduleName) | ||
if not data then return "" end | |||
local data = | |||
if not data | |||
local entryKey = moduleName .. "|" .. (id ~= "" and id or "default") | local entryKey = moduleName .. "|" .. (id ~= "" and id or "default") | ||
| Строка 298: | Строка 342: | ||
end | end | ||
local moduleName = get_module_name(pagePath) | |||
local moduleName = | local data = load_cached_data(moduleName) | ||
if not data then return "[]" end | |||
local data = | |||
if not data | |||
local idsTable = data.id | local idsTable = data.id | ||
| Строка 314: | Строка 351: | ||
end | end | ||
local matches = find_matching_ids(idsTable, keyPath, searchValue) | |||
local matches = | |||
if #matches == 0 then | if #matches == 0 then | ||
| Строка 369: | Строка 376: | ||
end | end | ||
local moduleName = get_module_name(pagePath) | |||
local moduleName = | local data = load_cached_data(moduleName) | ||
if not data then return "" end | |||
local data = | |||
if not data | |||
local idsTable = data.id | local idsTable = data.id | ||
| Строка 385: | Строка 385: | ||
end | end | ||
local matches = find_matching_ids(idsTable, keyPath, searchValue) | |||
local matches = | |||
if #matches == 0 then | if #matches == 0 then | ||
| Строка 434: | Строка 404: | ||
local result = table.concat(out, " ") | local result = table.concat(out, " ") | ||
return preprocess_or_return(frame, result) | |||
end | end | ||
| Строка 458: | Строка 424: | ||
tplStr = tplStr .. "}}" | tplStr = tplStr .. "}}" | ||
return preprocess_or_return(frame, tplStr) | |||
end | end | ||
| Строка 497: | Строка 459: | ||
local result = table.concat(out, " ") | local result = table.concat(out, " ") | ||
return preprocess_or_return(frame, result) | |||
return | end | ||
function p.getGenerator(frame) | |||
local args = frame.args or {} | |||
local searchId = args[1] or "" | |||
local kind = (args[2] or ""):lower() | |||
local generatorId = args[3] or "" | |||
if searchId == "" or generatorId == "" then | |||
return "" | |||
end | |||
if kind ~= "prototype" and kind ~= "component" then | |||
return "" | |||
end | |||
local idsJson = p.findInGenerator({ args = { searchId, kind, generatorId } }) | |||
local ok, ids = pcall(mw.text.jsonDecode, idsJson or "") | |||
if not ok or type(ids) ~= "table" or #ids == 0 then | |||
return "" | |||
end | |||
local okOut, outJson = pcall(mw.text.jsonEncode, ids) | |||
if okOut and outJson then | |||
return outJson | |||
end | end | ||
return | return "" | ||
end | end | ||
| Строка 513: | Строка 498: | ||
end | end | ||
local moduleName = " | local moduleName = get_module_name("component.json") | ||
local data = load_cached_data(moduleName) | |||
local data = | |||
if not data then | if not data then | ||
return "false" | |||
end | end | ||
| Строка 534: | Строка 513: | ||
end | end | ||
local target = tostring(compName) | |||
for _, v in ipairs(entry) do | for _, v in ipairs(entry) do | ||
if tostring(v) == | if tostring(v) == target then | ||
return "true" | return "true" | ||
end | end | ||