Модуль:JsonPaths: различия между версиями

Нет описания правки
Нет описания правки
 
(не показано 12 промежуточных версий этого же участника)
Строка 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 "")
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)
path = trim(path)


    if path == "Corvax" then
if path == "" or path == "Corvax" then
        return ""
return getCurrentGitNamespace()
    end
end


    return path
return path
end
end


local function resolvePath(path)
local function resolvePath(path)
    path = trim(path)
path = trim(path)
    if path ~= "" then
if path ~= "" then
        return normalizePath(path)
return normalizePath(path)
    end
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


    local frame = mw.getCurrentFrame()
local function isFrameLike(value)
    if not frame then
return type(value) == "table" and type(value.getParent) == "function"
        return ""
end
    end


    local args = getArgs(frame)
local function getPathFromCall(call)
    path = trim(args.path or "")
if type(call) == "string" then
return resolvePath(call)
end


    if path == "" then
if isFrameLike(call) then
        path = trim(frame:preprocess("{{#var:JsonPath}}") or "")
local args = getArgs(call)
    end
return resolvePath(args.path or args[1])
end


    return normalizePath(path)
if type(call) == "table" then
return resolvePath(call.path or call[1])
end
 
return resolvePath("")
end
end


function p.project(path)
function p.project(call)
    return resolvePath(path)
return getPathFromCall(call)
end
 
function p.prefix(call)
local path = getPathFromCall(call)
 
if path ~= "" then
return path .. ":"
end
 
return ""
end
 
function p.prefixFile(id, path)
if isFrameLike(id) then
local args = getArgs(id)
path = args.path or args[2]
id = args[1] or args.id
elseif type(id) == "table" then
path = id.path or id[2]
id = id[1] or id.id
end
 
id = trim(id)
path = resolvePath(path)
 
if id == "" then
return ""
end
 
if path ~= "" and p.has(id, path) then
return path .. "-" .. mw.getContentLanguage():ucfirst(id)
end
 
return id
end
end


local function getEntityDataTitle(path)
local function getEntityDataTitle(path)
    path = resolvePath(path)
path = resolvePath(path)
    if path == "" then
if path == "" then
        return ""
return ""
    end
end


    return "Модуль:IanComradeBot/" .. path .. "/entity project.json/data"
return "Модуль:IanComradeBot/" .. path .. "/entity project.json/data"
end
end


local function loadEntityIds(path)
local function loadEntityIds(path)
    path = resolvePath(path)
path = resolvePath(path)
    if path == "" then
if path == "" then
        return nil
return nil
    end
end


    if entityCache[path] ~= nil then
if entityCache[path] ~= nil then
        return entityCache[path]
return entityCache[path]
    end
end


    local title = getEntityDataTitle(path)
local title = getEntityDataTitle(path)
    local ok, data = pcall(mw.loadData, title)
local ok, data = pcall(mw.loadData, title)


    if not ok or type(data) ~= "table" then
if not ok or type(data) ~= "table" then
        entityCache[path] = {}
entityCache[path] = {}
        return entityCache[path]
return entityCache[path]
    end
end


    entityCache[path] = data
entityCache[path] = data
    return data
return data
end
end


local function arrayContains(list, value)
local function arrayContains(list, value)
    if type(list) ~= "table" then
if type(list) ~= "table" then
        return false
return false
    end
end


    for _, item in ipairs(list) do
for _, item in ipairs(list) do
        if item == value then
if item == value then
            return true
return true
        end
end
    end
end


    return false
return false
end
end


function p.has(id, path)
function p.has(id, path)
    id = trim(id)
if isFrameLike(id) then
    if id == "" then
local args = getArgs(id)
        return ""
id = args[1] or args.id
    end
path = args.path or args[2]
end


    path = resolvePath(path)
id = trim(id)
    if path == "" then
if id == "" then
        return ""
return ""
    end
end


    local ids = loadEntityIds(path)
path = resolvePath(path)
    if arrayContains(ids, id) then
if path == "" then
        return true
return ""
    end
end


    return false
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)
    rel = trim(rel)
if isFrameLike(rel) then
    if rel == "" then
local args = getArgs(rel)
        return ""
rel = args[1] or args.rel
    end
path = args.path or args[2]
end
 
rel = trim(rel)
if rel == "" then
return ""
end
 
path = resolvePath(path)


    path = resolvePath(path)
local prefix = "Module:IanComradeBot/"
if path ~= "" then
prefix = prefix .. path .. "/"
end
 
return prefix .. rel .. "/data"
end


    local prefix = "Module:IanComradeBot/"
function p.getJson(rel, path)
    if path ~= "" then
local modulePath = p.get(rel, path)
        prefix = prefix .. path .. "/"
if modulePath == "" then
    end
return ""
end


    return prefix .. rel .. "/data"
local jsonPath = modulePath:gsub("^Module:IanComradeBot/", "Участник:IanComradeBot/", 1)
return (jsonPath:gsub("/data$", ""))
end
end


function p.git(frame)
function p.git(call)
    local args = getArgs(frame)
local path = getPathFromCall(call)
    local path = resolvePath(args.path or args[1])


    if path == "Goob" then
if path == "Goob" then
        return "https://github.com/space-syndicate/Goob-Station/tree/master"
return "https://github.com/space-syndicate/Goob-Station/tree/master"
    elseif path == "CM" then
elseif path == "CM" then
        return "???"
return "https://github.com/Forge-Station/Colonial-Marine/tree/master"
    elseif path == "Fallout" then
elseif path == "Fallout" then
        return "https://github.com/Forge-Station/nuclear-14/tree/master"
return "https://github.com/Forge-Station/nuclear-14/tree/master"
    elseif path == "Frontier" then
elseif path == "Frontier" then
        return "https://github.com/Forge-Station/Frontier/tree/master"
return "https://github.com/Forge-Station/Frontier/tree/master"
    elseif path == "SW" then
elseif path == "SW" then
        return "???"
return "???"
    elseif path == "Wega" then
elseif path == "Wega" then
        return "https://github.com/wega-team/ss14-weg/tree/master"
return "https://github.com/wega-team/ss14-weg/tree/master"
    elseif path == "WL" then
elseif path == "WL" then
        return "https://github.com/corvax-team/ss14-wl/tree/master"
return "https://github.com/corvax-team/ss14-wl/tree/master"
    end
end


    return "https://github.com/space-syndicate/space-station-14/tree/master"
return "https://github.com/space-syndicate/space-station-14/tree/master"
end
end


return p
return p