Модуль:JsonPaths: различия между версиями
Pok (обсуждение | вклад) Нет описания правки |
Pok (обсуждение | вклад) Нет описания правки |
||
| (не показаны 2 промежуточные версии этого же участника) | |||
| Строка 3: | Строка 3: | ||
local entityCache = {} | local entityCache = {} | ||
local namespaces = { | |||
Goob = true, | |||
CM = true, | |||
Fallout = true, | |||
Frontier = true, | |||
SW = true, | |||
Wega = true, | |||
WL = true, | |||
} | |||
local function trim(value) | local function trim(value) | ||
return mw.text.trim(value or "") | |||
end | |||
local function getCurrentGitNamespace() | |||
local title = mw.title.getCurrentTitle() | |||
if not title then | |||
return "" | |||
end | |||
local ns = trim(title.nsText) | |||
if namespaces[ns] then | |||
return ns | |||
end | |||
return "" | |||
end | end | ||
local function normalizePath(path) | local function normalizePath(path) | ||
path = trim(path) | |||
if path == "" or path == "Corvax" then | |||
return getCurrentGitNamespace() | |||
end | |||
return path | |||
end | end | ||
local function resolvePath(path) | local function resolvePath(path) | ||
path = trim(path) | |||
if path ~= "" then | |||
return normalizePath(path) | |||
end | |||
local frame = mw.getCurrentFrame() | |||
if not frame then | |||
return "" | |||
end | |||
local args = getArgs(frame) | |||
path = trim(args.path or "") | |||
if path == "" then | |||
path = trim(frame:preprocess("{{#var:JsonPath}}") or "") | |||
end | |||
return normalizePath(path) | |||
end | end | ||
local function isFrameLike(value) | local function isFrameLike(value) | ||
return type(value) == "table" and type(value.getParent) == "function" | |||
end | end | ||
local function getPathFromCall(call) | local function getPathFromCall(call) | ||
if type(call) == "string" then | |||
return resolvePath(call) | |||
end | |||
if isFrameLike(call) then | |||
local args = getArgs(call) | |||
return resolvePath(args.path or args[1]) | |||
end | |||
if type(call) == "table" then | |||
return resolvePath(call.path or call[1]) | |||
end | |||
return resolvePath("") | |||
end | end | ||
function p.project(call) | function p.project(call) | ||
return getPathFromCall(call) | |||
end | end | ||
function p.prefix(call) | function p.prefix(call) | ||
local path = getPathFromCall(call) | |||
if path ~= "" then | |||
return path .. ":" | |||
end | |||
return "" | |||
end | end | ||
| Строка 99: | Строка 123: | ||
local function getEntityDataTitle(path) | local function getEntityDataTitle(path) | ||
path = resolvePath(path) | |||
if path == "" then | |||
return "" | |||
end | |||
return "Модуль:IanComradeBot/" .. path .. "/entity project.json/data" | |||
end | end | ||
local function loadEntityIds(path) | local function loadEntityIds(path) | ||
path = resolvePath(path) | |||
if path == "" then | |||
return nil | |||
end | |||
if entityCache[path] ~= nil then | |||
return entityCache[path] | |||
end | |||
local title = getEntityDataTitle(path) | |||
local ok, data = pcall(mw.loadData, title) | |||
if not ok or type(data) ~= "table" then | |||
entityCache[path] = {} | |||
return entityCache[path] | |||
end | |||
entityCache[path] = data | |||
return data | |||
end | end | ||
local function arrayContains(list, value) | local function arrayContains(list, value) | ||
if type(list) ~= "table" then | |||
return false | |||
end | |||
for _, item in ipairs(list) do | |||
if item == value then | |||
return true | |||
end | |||
end | |||
return false | |||
end | end | ||
function p.has(id, path) | function p.has(id, path) | ||
if isFrameLike(id) then | |||
local args = getArgs(id) | |||
id = args[1] or args.id | |||
path = args.path or args[2] | |||
end | |||
id = trim(id) | |||
if id == "" then | |||
return "" | |||
end | |||
path = resolvePath(path) | |||
if path == "" then | |||
return "" | |||
end | |||
local ids = loadEntityIds(path) | |||
if arrayContains(ids, id) then | |||
return true | |||
end | |||
return false | |||
end | end | ||
function p.get(rel, path) | function p.get(rel, path) | ||
if isFrameLike(rel) then | |||
local args = getArgs(rel) | |||
rel = args[1] or args.rel | |||
path = args.path or args[2] | |||
end | |||
rel = trim(rel) | |||
if rel == "" then | |||
return "" | |||
end | |||
path = resolvePath(path) | |||
local prefix = "Module:IanComradeBot/" | |||
if path ~= "" then | |||
prefix = prefix .. path .. "/" | |||
end | |||
return prefix .. rel .. "/data" | |||
end | |||
function p.getJson(rel, path) | |||
local modulePath = p.get(rel, path) | |||
if modulePath == "" then | |||
return "" | |||
end | |||
local jsonPath = modulePath:gsub("^Module:IanComradeBot/", "Участник:IanComradeBot/", 1) | |||
return (jsonPath:gsub("/data$", "")) | |||
end | end | ||
function p.git(call) | function p.git(call) | ||
local path = getPathFromCall(call) | |||
if path == "Goob" then | |||
return "https://github.com/space-syndicate/Goob-Station/tree/master" | |||
elseif path == "CM" then | |||
return "https://github.com/Forge-Station/Colonial-Marine/tree/master" | |||
elseif path == "Fallout" then | |||
return "https://github.com/Forge-Station/nuclear-14/tree/master" | |||
elseif path == "Frontier" then | |||
return "https://github.com/Forge-Station/Frontier/tree/master" | |||
elseif path == "SW" then | |||
return "???" | |||
elseif path == "Wega" then | |||
return "https://github.com/wega-team/ss14-weg/tree/master" | |||
elseif path == "WL" then | |||
return "https://github.com/corvax-team/ss14-wl/tree/master" | |||
end | |||
return "https://github.com/space-syndicate/space-station-14/tree/master" | |||
end | end | ||
return p | return p | ||