Модуль:Entity Sprite/all: различия между версиями

Нет описания правки
Нет описания правки
Строка 20: Строка 20:
elseif entry.state and entry.sprite then
elseif entry.state and entry.sprite then
table.insert(result, {
table.insert(result, {
state = tostring(entry.state or ""),  
state = tostring(entry.state or ""),
sprite = entry.sprite
sprite = entry.sprite
})
})
Строка 33: Строка 33:
end
end
return ""
return ""
end
local function splitCsv(value)
local result = {}
if value == nil then
return nil
end
value = mw.text.trim(tostring(value))
if value == "" then
return nil
end
for part in mw.text.gsplit(value, ",", true) do
local item = mw.text.trim(part)
if item ~= "" then
table.insert(result, item)
end
end
return (#result > 0) and result or nil
end
local function buildSet(value)
local list = splitCsv(value)
if not list then
return nil
end
local set = {}
for _, item in ipairs(list) do
set[item] = true
end
return set
end
local function getParents(entry)
if not entry then
return nil
end
if type(entry.parents) == "table" then
return entry.parents
end
if type(entry.parents) == "string" then
return splitCsv(entry.parents)
end
return nil
end
local function hasAnyParent(parents, set)
if not parents or not set then
return false
end
for _, parent in ipairs(parents) do
if set[parent] then
return true
end
end
return false
end
local function shouldIncludeEntry(entry, whitelistSet, blacklistSet)
local parents = getParents(entry)
if whitelistSet then
if not hasAnyParent(parents, whitelistSet) then
return false
end
end
if blacklistSet and hasAnyParent(parents, blacklistSet) then
return false
end
return true
end
local function filterSpriteData(spriteData, prototypeData, whitelistSet, blacklistSet)
local result = {}
for id, entry in pairs(spriteData) do
local protoEntry = prototypeData and prototypeData[id] or entry
if shouldIncludeEntry(protoEntry, whitelistSet, blacklistSet) then
result[id] = entry
end
end
return result
end
end


Строка 115: Строка 211:
local action = frame.args[1]
local action = frame.args[1]
local json = frame.args.json or "sprite_entity.json"
local json = frame.args.json or "sprite_entity.json"
 
local project = JsonPaths.project()
local project = JsonPaths.project()
local baseUrl = JsonPaths.git() .. "/Resources/Textures/"
local baseUrl = JsonPaths.git() .. "/Resources/Textures/"
local dataPage = JsonPaths.get(json)
local dataPage = JsonPaths.get(json)
local prototypesPage = JsonPaths.get("entity prototypes.json")
local spriteData = mw.loadData(dataPage)
local spriteData = mw.loadData(dataPage)
local prototypeData = mw.loadData(prototypesPage)


if not spriteData or type(spriteData) ~= "table" then
if not spriteData or type(spriteData) ~= "table" then
return "Ошибка загрузки JSON: " .. dataPage
return "Ошибка загрузки JSON: " .. dataPage
end
end
if not prototypeData or type(prototypeData) ~= "table" then
return "Ошибка загрузки JSON: " .. prototypesPage
end
local whitelistSet = buildSet(frame.args.whitelistParent)
local blacklistSet = buildSet(frame.args.blacklistParent)
local filteredData = filterSpriteData(spriteData, prototypeData, whitelistSet, blacklistSet)


if action == "repeat" then
if action == "repeat" then
return generateRepeatTemplate(spriteData, project)
return generateRepeatTemplate(filteredData, project)


elseif action == "image" then
elseif action == "image" then
local result = {}
local result = {}


for id, entry in pairs(spriteData) do
for id, entry in pairs(filteredData) do
local t = generateTemplate(id, entry, baseUrl, project)
local t = generateTemplate(id, entry, baseUrl, project)
if t then
if t then