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

Нет описания правки
Нет описания правки
 
(не показано 29 промежуточных версий этого же участника)
Строка 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
if shouldIncludeEntry(protoEntry, whitelistSet, blacklistSet) then
result[id] = entry
result[id] = entry
end
end
end
end
end
Строка 181: Строка 193:
end
end


local function getFirstSpriteAndState(entry)
local function buildFileLink(id, project)
local spritePath = getSpritePath(entry)
return "[[:Файл:" .. JsonPaths.prefixFile(id) .. ".png]]"
local states = getSpriteStates(entry)
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


if not spritePath then
local function buildSpriteStateLinks(baseUrl, states)
return nil, nil
if not states or #states == 0 then
return ""
end
end


if states and #states > 0 and states[1].state then
local links = {}
return spritePath, states[1].state
 
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


return spritePath, entry and entry.state or nil
return table.concat(links, ", ")
end
end


local function getRepeatSpriteUrl(entry, baseUrl)
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
return ""
end
end


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


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


return baseUrl .. spritePath
return pathLink
end
end


Строка 232: Строка 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 entry = obj.entry
local prefix = getPrefix(id, project)
local spriteUrl = getRepeatSpriteUrl(entry, baseUrl)
 
if spriteUrl then
table.insert(idLinks, "[" .. spriteUrl .. " " .. prefix .. id .. "]")
end
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, " ") ..
"|перенаправление=" .. JsonPaths.prefixFile(firstId) ..
"|id=" .. firstId ..
"|спрайт=" .. spriteValue ..
"|спрайт=" .. spriteValue ..
"|перенаправление=" .. prefix .. firstId ..
"|id=" .. firstId ..
"}}"
"}}"
))
))
Строка 271: Строка 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 ..
"}}"
"}}"
Строка 299: Строка 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()
Строка 305: Строка 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 spriteData = mw.loadData(dataPage)
local spriteDataRaw = mw.loadData(dataPage)
local prototypeData = mw.loadData(prototypesPage)
local parentDataRaw = mw.loadData(parentPage)
 
local spriteData = normalizeData(spriteDataRaw)
local parentData = normalizeData(parentDataRaw)


if not spriteData or type(spriteData) ~= "table" then
if not spriteData or type(spriteData) ~= "table" then
Строка 314: Строка 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 = {}