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

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


if type(entry.parents) == "string" then
return parents
return splitCsv(entry.parents)
end
 
return nil
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
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 buildSpriteValue(entry)
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


if stateName and stateName ~= "" then
local pathLink = buildSpritePathLink(baseUrl, spritePath)
return spritePath .. " (" .. stateName .. ")"
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
return pathLink
end
end


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


Строка 231: Строка 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 = buildSpriteValue(firstEntry) 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, " ") ..
"|перенаправление=" .. JsonPaths.prefixFile(firstId) ..
"|id=" .. firstId ..
"|спрайт=" .. spriteValue ..
"|спрайт=" .. spriteValue ..
"|перенаправление=" .. prefix .. firstId ..
"|id=" .. firstId ..
"}}"
"}}"
))
))
Строка 260: Строка 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 ..
"}}"
"}}"
Строка 288: Строка 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()
Строка 294: Строка 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
Строка 303: Строка 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 = {}