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

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


if not spritePath then
local function buildSpriteUrl(baseUrl, spritePath)
return nil, nil
return baseUrl .. spritePath
end
end


if states and #states > 0 and states[1].state then
local function buildSpritePathLink(baseUrl, spritePath)
return spritePath, states[1].state
local url = buildSpriteUrl(baseUrl, spritePath)
end
return "[" .. url .. " " .. spritePath .. "]"
 
if entry and entry.state then
return spritePath, tostring(entry.state)
end
 
return spritePath, nil
end
end


local function buildSpriteValue(entry)
local function buildStateLink(baseUrl, spritePath, state)
local spritePath, stateName = getFirstSpriteAndState(entry)
local url = buildSpriteUrl(baseUrl, spritePath) .. "/" .. state .. ".png"
 
return "[" .. url .. " " .. state .. "]"
if not spritePath then
return nil
end
 
if stateName and stateName ~= "" then
return spritePath .. " (" .. stateName .. ")"
end
 
return spritePath
end
end


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


if states and #states > 0 and states[1].state then
local links = {}
return spritePath, states[1].state
end


if entry and entry.state then
for _, item in ipairs(states) do
return spritePath, tostring(entry.state)
if item.sprite and item.state then
table.insert(links, buildStateLink(baseUrl, item.sprite, item.state))
end
end
end


return spritePath, nil
return table.concat(links, ", ")
end
end


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


local pathLink = "[" .. baseUrl .. spritePath .. " " .. spritePath .. "]"
local pathLink = buildSpritePathLink(baseUrl, spritePath)
local states = getSpriteStates(entry)


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


Строка 267: Строка 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 spriteValue = buildLinkedSpriteValue(firstEntry, baseUrl) or ""


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 ..
Строка 296: Строка 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 ..
"}}"
"}}"
Строка 324: Строка 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()
Строка 330: Строка 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
Строка 339: Строка 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, baseUrl)
return generateRepeatTemplate(filteredData, project, baseUrl)
elseif action == "image" then
elseif action == "image" then
local result = {}
local result = {}