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

Нет описания правки
Нет описания правки
 
(не показана 31 промежуточная версия этого же участника)
Строка 11: Строка 11:


return path
return path
end
local function normalizeData(data)
if type(data) ~= "table" then
return nil
end
if type(data.id) == "table" then
return data.id
end
return data
end
end


Строка 75: Строка 87:


local function getSpritePath(entry)
local function getSpritePath(entry)
return normalizeSpritePath(entry.sprite)
if entry.sprite then
end
return normalizeSpritePath(entry.sprite)
end


local function getPrefix(id, project)
if entry.layers and type(entry.layers) == "table" then
if project ~= "" and JsonPaths.has(id, project) then
for _, layer in ipairs(entry.layers) do
return project .. ":"
if layer.sprite then
return normalizeSpritePath(layer.sprite)
end
end
end
end
return ""
 
return nil
end
end


Строка 121: Строка 138:
end
end


local function getParents(entry)
local function getParents(parentData, id)
if not entry then
if not parentData or type(parentData) ~= "table" or not id then
return nil
return nil
end
end


if type(entry.parents) == "table" then
local parents = parentData[id]
return entry.parents
if type(parents) ~= "table" then
end
return nil
 
if type(entry.parents) == "string" then
return splitCsv(entry.parents)
end
end


return nil
return parents
end
end


Строка 151: Строка 165:
end
end


local function shouldIncludeEntry(entry, whitelistSet, blacklistSet)
local function shouldIncludeEntry(id, whitelistSet, blacklistSet, parentData)
local parents = getParents(entry)
local parents = getParents(parentData, id)


if whitelistSet then
if whitelistSet and not hasAnyParent(parents, whitelistSet) then
if not hasAnyParent(parents, whitelistSet) then
return false
return false
end
end
end


Строка 167: Строка 179:
end
end


local function filterSpriteData(spriteData, prototypeData, whitelistSet, blacklistSet)
local function filterSpriteData(spriteData, parentData, whitelistSet, blacklistSet, project)
local result = {}
local result = {}


for id, entry in pairs(spriteData) do
for id, entry in pairs(spriteData) do
local protoEntry = prototypeData and prototypeData[id] or entry
if shouldIncludeEntry(id, whitelistSet, blacklistSet, parentData) then
if project == "" or JsonPaths.has(id, project) then
result[id] = entry
end
end
end


if shouldIncludeEntry(protoEntry, whitelistSet, blacklistSet) then
return result
result[id] = entry
end
 
local function buildFileLink(id, project)
return "[[:Файл:" .. JsonPaths.prefixFile(id) .. ".png]]"
end
 
local function buildSpriteUrl(baseUrl, spritePath)
return baseUrl .. spritePath
end
 
local function buildSpritePathLink(baseUrl, spritePath)
local url = buildSpriteUrl(baseUrl, spritePath)
return "[" .. url .. " " .. spritePath .. "]"
end
 
local function buildStateLink(baseUrl, spritePath, state)
local url = buildSpriteUrl(baseUrl, spritePath) .. "/" .. state .. ".png"
return "[" .. url .. " " .. state .. "]"
end
 
local function buildSpriteStateLinks(baseUrl, states)
if not states or #states == 0 then
return ""
end
 
local links = {}
 
for _, item in ipairs(states) do
if item.sprite and item.state then
table.insert(links, buildStateLink(baseUrl, item.sprite, item.state))
end
end
end
end


return result
return table.concat(links, ", ")
end
end


local function getFirstSpriteAndState(entry)
local function buildRepeatSpriteValue(baseUrl, entry)
local spritePath = getSpritePath(entry)
local spritePath = getSpritePath(entry)
local states = getSpriteStates(entry)
if not spritePath then
if not spritePath then
return nil, nil
return ""
end
end


if states and #states > 0 and states[1].state then
local pathLink = buildSpritePathLink(baseUrl, spritePath)
return spritePath, states[1].state
local states = getSpriteStates(entry)
 
if states and #states > 0 and states[1].state and states[1].state ~= "" then
return pathLink .. " (" .. buildStateLink(baseUrl, spritePath, states[1].state) .. ")"
end
end


return spritePath, entry and entry.state or nil
return pathLink
end
end


local function generateRepeatTemplate(data, project)
local function generateRepeatTemplate(data, project, baseUrl)
local spriteGroups = {}
local spriteGroups = {}


Строка 213: Строка 260:


for _, obj in ipairs(group) do
for _, obj in ipairs(group) do
local id = obj.id
table.insert(idLinks, buildFileLink(obj.id, project))
local prefix = getPrefix(id, project)
 
table.insert(idLinks, "[[:Файл:" .. prefix .. id .. ".png]]")
end
end


local firstId = group[1].id
local firstId = group[1].id
local firstEntry = group[1].entry
local firstEntry = group[1].entry
local prefix = getPrefix(firstId, project)
local spriteValue = buildRepeatSpriteValue(baseUrl, firstEntry)
 
local spritePath, stateName = getFirstSpriteAndState(firstEntry)
local spriteValue = spritePath or ""
 
if stateName and stateName ~= "" then
spriteValue = spriteValue .. " (" .. stateName .. ")"
end


table.insert(result, mw.getCurrentFrame():preprocess(
table.insert(result, mw.getCurrentFrame():preprocess(
"{{Entity Sprite/Repeat|спрайты=" .. table.concat(idLinks, " ") ..
"{{Entity Sprite/Repeat|файлы=" .. table.concat(idLinks, " ") ..
"|перенаправление=" .. prefix .. firstId ..
"|перенаправление=" .. JsonPaths.prefixFile(firstId) ..
"|id=" .. firstId ..
"|id=" .. firstId ..
"|спрайт=" .. spriteValue ..
"|спрайт=" .. spriteValue ..
Строка 248: Строка 285:
return nil
return nil
end
end
local prefix = getPrefix(id, project)


local states = getSpriteStates(entry)
local states = getSpriteStates(entry)
local stateStr = ""
local stateStr = buildSpriteStateLinks(baseUrl, states)
 
if states then
local links = {}
for _, item in ipairs(states) do
if item.sprite and item.state then
local url = baseUrl .. item.sprite .. "/" .. item.state .. ".png"
table.insert(links, "[" .. url .. " " .. item.state .. "]")
end
end
stateStr = table.concat(links, ", ")
end


return mw.getCurrentFrame():preprocess(
return mw.getCurrentFrame():preprocess(
"{{Entity Sprite/Image|файл=" .. prefix .. id ..
"{{Entity Sprite/Image|файл=" .. JsonPaths.prefixFile(id) ..
"|id=" .. id ..
"|id=" .. id ..
"|путь=" .. baseUrl .. spritePath ..
"|путь=" .. buildSpriteUrl(baseUrl, spritePath) ..
"|state=" .. stateStr ..
"|state=" .. stateStr ..
"}}"
"}}"
Строка 276: Строка 300:
function p.main(frame)
function p.main(frame)
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 "component/Sprite.json"


local project = JsonPaths.project()
local project = JsonPaths.project()
Строка 282: Строка 306:


local dataPage = JsonPaths.get(json)
local dataPage = JsonPaths.get(json)
local prototypesPage = JsonPaths.get("entity prototypes.json")
local parentPage = JsonPaths.get("entity parent.json")
 
local spriteDataRaw = mw.loadData(dataPage)
local parentDataRaw = mw.loadData(parentPage)


local spriteData = mw.loadData(dataPage)
local spriteData = normalizeData(spriteDataRaw)
local prototypeData = mw.loadData(prototypesPage)
local parentData = normalizeData(parentDataRaw)


if not spriteData or type(spriteData) ~= "table" then
if not spriteData or type(spriteData) ~= "table" then
Строка 291: Строка 318:
end
end


if not prototypeData or type(prototypeData) ~= "table" then
if not parentData or type(parentData) ~= "table" then
return "Ошибка загрузки JSON: " .. prototypesPage
return "Ошибка загрузки JSON: " .. parentPage
end
end


local whitelistSet = buildSet(frame.args.whitelistParent)
local whitelistSet = buildSet(frame.args.whitelistParent)
local blacklistSet = buildSet(frame.args.blacklistParent)
local blacklistSet = buildSet(frame.args.blacklistParent)
 
local filteredData = filterSpriteData(spriteData, parentData, whitelistSet, blacklistSet, project)
local filteredData = filterSpriteData(spriteData, prototypeData, whitelistSet, blacklistSet)


if action == "repeat" then
if action == "repeat" then
return generateRepeatTemplate(filteredData, project)
return generateRepeatTemplate(filteredData, project, baseUrl)
 
elseif action == "image" then
elseif action == "image" then
local result = {}
local result = {}