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

Нет описания правки
Нет описания правки
Строка 11: Строка 11:


return path
return path
end
local function getSpritePath(entry)
return entry and normalizeSpritePath(entry.sprite) or nil
end
local function getSpriteStates(entry)
local result = {}
if entry and entry.layers and type(entry.layers) == "table" then
for _, layer in ipairs(entry.layers) do
if layer.visible ~= false and layer.state then
result[#result + 1] = {
state = tostring(layer.state),
sprite = normalizeSpritePath(layer.sprite or entry.sprite)
}
end
end
elseif entry and entry.state and entry.sprite then
result[#result + 1] = {
state = tostring(entry.state),
sprite = normalizeSpritePath(entry.sprite)
}
end
return (#result > 0) and result or nil
end
local function getPrimaryState(entry)
local states = getSpriteStates(entry)
if states and states[1] and states[1].state and states[1].state ~= "" then
return states[1].state
end
if entry and entry.state then
return tostring(entry.state)
end
return nil
end
local function buildSpriteLink(baseUrl, spritePath)
return "[" .. baseUrl .. spritePath .. " " .. spritePath .. "]"
end
local function buildStateLink(baseUrl, spritePath, stateName)
return "[" .. baseUrl .. spritePath .. "/" .. stateName .. ".png " .. stateName .. "]"
end
local function buildStateLinks(entry, baseUrl)
local spritePath = getSpritePath(entry)
local states = getSpriteStates(entry)
if not spritePath or not states then
return nil
end
local links = {}
for _, item in ipairs(states) do
if item.sprite and item.state then
links[#links + 1] = buildStateLink(baseUrl, item.sprite, item.state)
end
end
return (#links > 0) and links or nil
end
local function renderTemplate(template)
return mw.getCurrentFrame():preprocess(template)
end
end


Строка 89: Строка 18:
local function addField(name, value)
local function addField(name, value)
if value ~= nil then
if value ~= nil then
parts[#parts + 1] = name .. "=" .. tostring(value)
table.insert(parts, name .. "=" .. tostring(value))
end
end
end
end


addField("sprite", getSpritePath(entry))
addField("sprite", normalizeSpritePath(entry.sprite))
addField("state", entry.state)
addField("state", entry.state)
addField("scale", entry.scale)
addField("scale", entry.scale)
Строка 112: Строка 41:


table.sort(layerParts)
table.sort(layerParts)
layers[#layers + 1] = table.concat(layerParts, ",")
table.insert(layers, table.concat(layerParts, ","))
end
end


table.sort(layers)
table.sort(layers)
parts[#parts + 1] = "layers=" .. table.concat(layers, "|")
table.insert(parts, "layers=" .. table.concat(layers, "|"))
end
end


table.sort(parts)
table.sort(parts)
return table.concat(parts, ";")
return table.concat(parts, ";")
end
local function getSpriteStates(entry)
local result = {}
if entry.layers and type(entry.layers) == "table" then
for _, layer in ipairs(entry.layers) do
if layer.visible ~= false and layer.state then
table.insert(result, {
state = tostring(layer.state),
sprite = normalizeSpritePath(layer.sprite or entry.sprite)
})
end
end
elseif entry.state and entry.sprite then
table.insert(result, {
state = tostring(entry.state),
sprite = normalizeSpritePath(entry.sprite)
})
end
return (#result > 0) and result or nil
end
local function getSpritePath(entry)
return normalizeSpritePath(entry.sprite)
end
local function getPrefix(id, project)
if project ~= "" and JsonPaths.has(id, project) then
return project .. ":"
end
return ""
end
end


Строка 138: Строка 100:
local item = mw.text.trim(part)
local item = mw.text.trim(part)
if item ~= "" then
if item ~= "" then
result[#result + 1] = item
table.insert(result, item)
end
end
end
end
Строка 215: Строка 177:


return result
return result
end
local function buildFileLink(id, project)
local prefix = getPrefix(id, project)
return "[[:Файл:" .. prefix .. 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
return table.concat(links, ", ")
end
local function buildRepeatSpriteValue(baseUrl, entry)
local spritePath = getSpritePath(entry)
if not spritePath then
return ""
end
local pathLink = buildSpritePathLink(baseUrl, spritePath)
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
return pathLink
end
end


Строка 224: Строка 237:


spriteGroups[key] = spriteGroups[key] or {}
spriteGroups[key] = spriteGroups[key] or {}
spriteGroups[key][#spriteGroups[key] + 1] = { id = id, entry = entry }
table.insert(spriteGroups[key], { id = id, entry = entry })
end
end


Строка 234: Строка 247:


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 = (project ~= "" and JsonPaths.has(id, project)) and (project .. ":") or ""
idLinks[#idLinks + 1] = "[[:Файл:" .. 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 = (project ~= "" and JsonPaths.has(firstId, project)) and (project .. ":") or ""
local prefix = getPrefix(firstId, project)
local spriteValue = buildRepeatSpriteValue(baseUrl, firstEntry)


local spritePath = getSpritePath(firstEntry)
table.insert(result, mw.getCurrentFrame():preprocess(
local spriteValue = ""
 
if spritePath then
spriteValue = buildSpriteLink(baseUrl, spritePath)
 
local stateName = getPrimaryState(firstEntry)
if stateName and stateName ~= "" then
spriteValue = spriteValue .. " (" .. buildStateLink(baseUrl, spritePath, stateName) .. ")"
end
end
 
result[#result + 1] = renderTemplate(
"{{Entity Sprite/Repeat|файлы=" .. table.concat(idLinks, " ") ..
"{{Entity Sprite/Repeat|файлы=" .. table.concat(idLinks, " ") ..
"|перенаправление=" .. prefix .. firstId ..
"|перенаправление=" .. prefix .. firstId ..
Строка 261: Строка 261:
"|спрайт=" .. spriteValue ..
"|спрайт=" .. spriteValue ..
"}}"
"}}"
)
))
end
end
end
end
Строка 274: Строка 274:
end
end


local prefix = (project ~= "" and JsonPaths.has(id, project)) and (project .. ":") or ""
local prefix = getPrefix(id, project)
 
local states = getSpriteStates(entry)
local stateLinks = buildStateLinks(entry, baseUrl)
local stateStr = buildSpriteStateLinks(baseUrl, states)
local stateStr = stateLinks and table.concat(stateLinks, ", ") or ""


return renderTemplate(
return mw.getCurrentFrame():preprocess(
"{{Entity Sprite/Image|файл=" .. prefix .. id ..
"{{Entity Sprite/Image|файл=" .. prefix .. id ..
"|id=" .. id ..
"|id=" .. id ..
"|путь=" .. baseUrl .. spritePath ..
"|путь=" .. buildSpriteUrl(baseUrl, spritePath) ..
"|state=" .. stateStr ..
"|state=" .. stateStr ..
"}}"
"}}"
Строка 322: Строка 321:
local t = generateTemplate(id, entry, baseUrl, project)
local t = generateTemplate(id, entry, baseUrl, project)
if t then
if t then
result[#result + 1] = t
table.insert(result, t)
end
end
end
end