Модуль:GetField: различия между версиями
Pok (обсуждение | вклад) мНет описания правки |
Pok (обсуждение | вклад) Нет описания правки |
||
| Строка 3: | Строка 3: | ||
local JsonPaths = require('Module:JsonPaths') | local JsonPaths = require('Module:JsonPaths') | ||
local getArgs = require('Module:Arguments').getArgs | local getArgs = require('Module:Arguments').getArgs | ||
local function load_cached_data(moduleName) | local function load_cached_data(moduleName) | ||
| Строка 14: | Строка 10: | ||
end | end | ||
return loaded | return loaded | ||
end | end | ||
| Строка 37: | Строка 19: | ||
local parsed = {} | local parsed = {} | ||
for part in string.gmatch(path, "([^%.]+)") do | for part in string.gmatch(path, "([^%.]+)") do | ||
parsed[#parsed + 1] = { | local key, idxStr = string.match(part, "^(.-)%[(%d+)%]$") | ||
if key then | |||
parsed[#parsed + 1] = { key, tonumber(idxStr) } | |||
else | |||
local num = tonumber(part) | |||
if num then | |||
parsed[#parsed + 1] = { nil, num } | |||
else | |||
parsed[#parsed + 1] = { part, nil } | |||
end | |||
end | |||
end | end | ||
| Строка 43: | Строка 35: | ||
end | end | ||
local function | local function navigate_path(tbl, path) | ||
if not tbl | if not tbl then return nil end | ||
if not path or path == "" then return tbl end | |||
end | |||
local cur = tbl | local cur = tbl | ||
local start = 1 | |||
local len = #path | |||
while start <= len do | |||
if type(cur) ~= "table" then | local dotPos = string.find(path, ".", start, true) | ||
local part | |||
if dotPos then | |||
part = string.sub(path, start, dotPos - 1) | |||
start = dotPos + 1 | |||
else | |||
part = string.sub(path, start) | |||
start = len + 1 | |||
end | |||
if type(cur) ~= "table" then return nil end | |||
local bracketPos = string.find(part, "[", 1, true) | |||
if bracketPos then | |||
local key = string.sub(part, 1, bracketPos - 1) | |||
local idx = tonumber(string.sub(part, bracketPos + 1, #part - 1)) | |||
if key ~= "" then | |||
local val = cur[key] | |||
if val == nil then val = cur["!type:" .. key] end | |||
cur = val | |||
end | end | ||
if idx then | |||
if type(cur) ~= "table" then return nil end | |||
cur = cur[idx] | |||
end | end | ||
cur = | else | ||
local num = tonumber(part) | |||
if num then | |||
cur = cur[num] | |||
else | |||
local val = cur[part] | |||
if val == nil then val = cur["!type:" .. part] end | |||
cur = val | |||
end | end | ||
end | end | ||
if cur == nil then | if cur == nil then return nil end | ||
end | end | ||
return cur | return cur | ||
end | end | ||
local function format_value(v) | local function format_value(v) | ||
if v == nil then | |||
return "null" | return "null" | ||
end | end | ||
| Строка 99: | Строка 97: | ||
return tostring(v) | return tostring(v) | ||
elseif t == "table" then | elseif t == "table" then | ||
local ok, | local ok, json = pcall(mw.text.jsonEncode, v) | ||
if ok and | if ok and json then | ||
return | return json | ||
end | end | ||
return "" | return "" | ||
| Строка 107: | Строка 105: | ||
return tostring(v) | return tostring(v) | ||
end | end | ||
end | end | ||
| Строка 173: | Строка 167: | ||
return merged | return merged | ||
end | end | ||
return | return specific | ||
end | end | ||
end | end | ||
| Строка 212: | Строка 174: | ||
local base = data["default"] | local base = data["default"] | ||
if type(base) == "table" then | if type(base) == "table" then | ||
return | return base | ||
end | end | ||
return nil | return nil | ||
end | end | ||
| Строка 256: | Строка 205: | ||
local function contains_target(v, target) | local function contains_target(v, target) | ||
if type(v) == "string" then | |||
return v == target | |||
end | |||
if type(v) == "table" then | if type(v) == "table" then | ||
if is_array(v) then | if is_array(v) then | ||
| Строка 342: | Строка 294: | ||
local parts = {} | local parts = {} | ||
local function walk(tbl, prefix) | local function walk(tbl, prefix) | ||
| Строка 366: | Строка 311: | ||
if type(v) == "table" then | if type(v) == "table" then | ||
if next(v) ~= nil then | if next(v) ~= nil then | ||
local ok, json = pcall(mw.text.jsonEncode, v) | |||
if ok and json then | |||
parts[#parts + 1] = key .. "=<nowiki>" .. json .. "</nowiki>" | |||
end | |||
if is_array(v) then | if is_array(v) then | ||
local first = v[1] | local first = v[1] | ||
| Строка 406: | Строка 354: | ||
local ok, json = pcall(mw.text.jsonEncode, value) | local ok, json = pcall(mw.text.jsonEncode, value) | ||
if ok and json then | if ok and json then | ||
parts[#parts + 1] = key .. "=" .. | parts[#parts + 1] = key .. "=<nowiki>" .. json .. "</nowiki>" | ||
end | end | ||
return | return | ||
| Строка 426: | Строка 374: | ||
if type(key) == "string" and key ~= "" and not seen[key] then | if type(key) == "string" and key ~= "" and not seen[key] then | ||
seen[key] = true | seen[key] = true | ||
append_flattened_part(parts, key, | append_flattened_part(parts, key, navigate_path(entry, key)) | ||
end | end | ||
end | end | ||
| Строка 465: | Строка 413: | ||
end | end | ||
local function build_tpl(id, pagePath, tplPath, data, tplArgs) | local function build_tpl(id, pagePath, tplPath, data, tplArgs, preEntry) | ||
if id == "" or pagePath == "" or tplPath == "" then | if id == "" or pagePath == "" or tplPath == "" then | ||
return "" | return "" | ||
end | end | ||
local moduleName = | local moduleName = JsonPaths.get(pagePath) | ||
data = data or load_cached_data(moduleName) | data = data or load_cached_data(moduleName) | ||
if not data then | if not data then | ||
| Строка 476: | Строка 424: | ||
end | end | ||
local entry = resolve_entry(data, id) | local entry = preEntry or resolve_entry(data, id) | ||
local extra = flatten_entry(entry) | local extra = flatten_entry(entry) | ||
local extraTplArgs = tplArgs or "" | local extraTplArgs = tplArgs or "" | ||
| Строка 509: | Строка 457: | ||
local storeName = (kind == "prototype") and "prototype_store.json" or "component_store.json" | local storeName = (kind == "prototype") and "prototype_store.json" or "component_store.json" | ||
local moduleName = | local moduleName = JsonPaths.get(storeName) | ||
local data = load_cached_data(moduleName) | local data = load_cached_data(moduleName) | ||
if not data then | if not data then | ||
| Строка 546: | Строка 494: | ||
end | end | ||
local moduleName = | local moduleName = JsonPaths.get(pagePath) | ||
local data = load_cached_data(moduleName) | local data = load_cached_data(moduleName) | ||
if not data then | if not data then | ||
| Строка 570: | Строка 518: | ||
end | end | ||
local moduleName = | local moduleName = JsonPaths.get(pagePath) | ||
local data = load_cached_data(moduleName) | local data = load_cached_data(moduleName) | ||
if not data then | if not data then | ||
| Строка 595: | Строка 543: | ||
end | end | ||
local moduleName = | local moduleName = JsonPaths.get(pagePath) | ||
local data = load_cached_data(moduleName) | local data = load_cached_data(moduleName) | ||
if not data then | if not data then | ||
| Строка 610: | Строка 558: | ||
end | end | ||
return format_value(navigate_path(entry, keyPath)) | |||
end | end | ||
| Строка 649: | Строка 596: | ||
if key and key ~= "" then | if key and key ~= "" then | ||
nextCur = tbl[key] | nextCur = tbl[key] | ||
if nextCur == nil then | if nextCur == nil then nextCur = tbl["!type:" .. key] end | ||
else | else | ||
nextCur = tbl | nextCur = tbl | ||
| Строка 717: | Строка 662: | ||
end | end | ||
local moduleName = | local moduleName = JsonPaths.get(pagePath) | ||
local data = load_cached_data(moduleName) | local data = load_cached_data(moduleName) | ||
if not data then | if not data then | ||
| Строка 785: | Строка 730: | ||
end | end | ||
local moduleName = | local moduleName = JsonPaths.get(pagePath) | ||
local data = load_cached_data(moduleName) | local data = load_cached_data(moduleName) | ||
if not data then | if not data then | ||
| Строка 802: | Строка 747: | ||
local matches = {} | local matches = {} | ||
local entryCache = {} | |||
if searchType == "path" then | if searchType == "path" then | ||
for _, idKey in ipairs(ids) do | for _, idKey in ipairs(ids) do | ||
local entry = resolve_entry(data, idKey) | local entry = resolve_entry(data, idKey) | ||
entryCache[idKey] = entry | |||
if type(entry) == "table" and entry_has_any_nonempty_path(entry, parsedPath) then | if type(entry) == "table" and entry_has_any_nonempty_path(entry, parsedPath) then | ||
matches[#matches + 1] = idKey | matches[#matches + 1] = idKey | ||
| Строка 814: | Строка 761: | ||
for _, idKey in ipairs(ids) do | for _, idKey in ipairs(ids) do | ||
local entry = resolve_entry(data, idKey) | local entry = resolve_entry(data, idKey) | ||
entryCache[idKey] = entry | |||
if type(entry) == "table" and entry_matches_path(entry, parsedPath, target, searchType) then | if type(entry) == "table" and entry_matches_path(entry, parsedPath, target, searchType) then | ||
matches[#matches + 1] = idKey | matches[#matches + 1] = idKey | ||
| Строка 826: | Строка 774: | ||
local out = {} | local out = {} | ||
for _, idKey in ipairs(matches) do | for _, idKey in ipairs(matches) do | ||
local tpl = build_tpl(idKey, pagePath, tplPath, data, tplArgs) | local tpl = build_tpl(idKey, pagePath, tplPath, data, tplArgs, entryCache[idKey]) | ||
if tpl ~= "" then | if tpl ~= "" then | ||
out[#out + 1] = tpl | out[#out + 1] = tpl | ||
| Строка 852: | Строка 800: | ||
end | end | ||
local moduleName = | local moduleName = JsonPaths.get(pagePath) | ||
local data = frame.data | local data = frame.data | ||
if not data then | if not data then | ||
| Строка 890: | Строка 838: | ||
end | end | ||
local moduleName = | local moduleName = JsonPaths.get(pagePath) | ||
local data = load_cached_data(moduleName) | local data = load_cached_data(moduleName) | ||
if not data then | if not data then | ||
| Строка 948: | Строка 896: | ||
end | end | ||
local moduleName = | local moduleName = JsonPaths.get("component.json") | ||
local data = load_cached_data(moduleName) | local data = load_cached_data(moduleName) | ||
if not data then | if not data then | ||
| Строка 963: | Строка 911: | ||
end | end | ||
for _, v in ipairs(entry) do | for _, v in ipairs(entry) do | ||
if tostring(v) == | if tostring(v) == compName then | ||
return "true" | return "true" | ||
end | end | ||
| Строка 983: | Строка 930: | ||
end | end | ||
local moduleName = | local moduleName = JsonPaths.get(pagePath) | ||
local data = load_cached_data(moduleName) | local data = load_cached_data(moduleName) | ||
if not data then | if not data then | ||
| Строка 1034: | Строка 981: | ||
end | end | ||
local moduleName = | local moduleName = JsonPaths.get(pagePath) | ||
local data = load_cached_data(moduleName) | local data = load_cached_data(moduleName) | ||
if not data then | if not data then | ||
| Строка 1063: | Строка 1010: | ||
local ok, json = pcall(mw.text.jsonEncode, value) | local ok, json = pcall(mw.text.jsonEncode, value) | ||
if ok and json then | if ok and json then | ||
return | return "<nowiki>" .. json .. "</nowiki>" | ||
end | end | ||
return nil | return nil | ||
| Строка 1142: | Строка 1089: | ||
local json = encode_nowiki_json(value) | local json = encode_nowiki_json(value) | ||
if json then | if json then | ||
parts[#parts + 1] = prefix .. "=" .. | parts[#parts + 1] = prefix .. "=" .. json | ||
end | end | ||
end | end | ||
| Строка 1162: | Строка 1109: | ||
local json = encode_nowiki_json(v) | local json = encode_nowiki_json(v) | ||
if json then | if json then | ||
parts[#parts + 1] = key .. "=" .. | parts[#parts + 1] = key .. "=" .. json | ||
end | end | ||
elseif options.nestedKeyMode == "raw" then | elseif options.nestedKeyMode == "raw" then | ||
local json = encode_nowiki_json(v) | local json = encode_nowiki_json(v) | ||
if json then | if json then | ||
parts[#parts + 1] = key .. "=" .. | parts[#parts + 1] = key .. "=" .. json | ||
end | end | ||
end | end | ||
| Строка 1260: | Строка 1207: | ||
local json = encode_nowiki_json(v) | local json = encode_nowiki_json(v) | ||
if json then | if json then | ||
parts[#parts + 1] = "value=" .. | parts[#parts + 1] = "value=" .. json | ||
end | end | ||
append_table_fields(parts, v, rawTypeOptions, nil) | append_table_fields(parts, v, rawTypeOptions, nil) | ||
| Строка 1270: | Строка 1217: | ||
local json = encode_nowiki_json(v) | local json = encode_nowiki_json(v) | ||
if json then | if json then | ||
parts[#parts + 1] = "value=" .. | parts[#parts + 1] = "value=" .. json | ||
end | end | ||
end | end | ||