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

Материал из Space Station 14 Вики
Новая страница: «local p = {} function p.get(rel, BD) if type(rel) ~= "string" or rel == "" then return "" end if (not BD or BD == "") and mw.getCurrentFrame then local frame = mw.getCurrentFrame() BD = (frame.args and frame.args.BD) or "" end local prefix = "Module:IanComradeBot/" if BD and BD ~= "" then prefix = prefix .. BD .. "/" end return prefix .. rel .. "/data" end return p»
 
Нет описания правки
 
(не показано 20 промежуточных версий этого же участника)
Строка 1: Строка 1:
local p = {}
local p = {}
local getArgs = require('Module:Arguments').getArgs


function p.get(rel, BD)
local entityCache = {}
    if type(rel) ~= "string" or rel == "" then
        return ""
    end


    if (not BD or BD == "") and mw.getCurrentFrame then
local namespaces = {
        local frame = mw.getCurrentFrame()
Goob = true,
        BD = (frame.args and frame.args.BD) or ""
CM = true,
    end
Fallout = true,
Frontier = true,
SW = true,
Wega = true,
WL = true,
}


    local prefix = "Module:IanComradeBot/"
local function trim(value)
    if BD and BD ~= "" then
return mw.text.trim(value or "")
        prefix = prefix .. BD .. "/"
end
    end


    return prefix .. rel .. "/data"
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
 
local function normalizePath(path)
path = trim(path)
 
if path == "" or path == "Corvax" then
return getCurrentGitNamespace()
end
 
return path
end
 
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
 
local function isFrameLike(value)
return type(value) == "table" and type(value.getParent) == "function"
end
 
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
 
function p.project(call)
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
 
local function getEntityDataTitle(path)
path = resolvePath(path)
if path == "" then
return ""
end
 
return "Модуль:IanComradeBot/" .. path .. "/entity project.json/data"
end
 
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
 
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
 
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
 
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
 
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

Текущая версия от 01:48, 21 июня 2026

Для документации этого модуля может быть создана страница Модуль:JsonPaths/doc

local p = {}
local getArgs = require('Module:Arguments').getArgs

local entityCache = {}

local namespaces = {
	Goob = true,
	CM = true,
	Fallout = true,
	Frontier = true,
	SW = true,
	Wega = true,
	WL = true,
}

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

local function normalizePath(path)
	path = trim(path)

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

	return path
end

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

local function isFrameLike(value)
	return type(value) == "table" and type(value.getParent) == "function"
end

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

function p.project(call)
	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

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

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

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

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

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

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

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

return p