Модуль:Entity Sprite/all: различия между версиями
Pok (обсуждение | вклад) Нет описания правки |
Pok (обсуждение | вклад) Нет описания правки |
||
| Строка 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 | ||
| Строка 18: | Строка 89: | ||
local function addField(name, value) | local function addField(name, value) | ||
if value ~= nil then | if value ~= nil then | ||
parts[#parts + 1] = name .. "=" .. tostring(value) | |||
end | end | ||
end | end | ||
addField("sprite", | addField("sprite", getSpritePath(entry)) | ||
addField("state", entry.state) | addField("state", entry.state) | ||
addField("scale", entry.scale) | addField("scale", entry.scale) | ||
| Строка 41: | Строка 112: | ||
table.sort(layerParts) | table.sort(layerParts) | ||
layers[#layers + 1] = table.concat(layerParts, ",") | |||
end | end | ||
table.sort(layers) | table.sort(layers) | ||
parts[#parts + 1] = "layers=" .. table.concat(layers, "|") | |||
end | end | ||
table.sort(parts) | table.sort(parts) | ||
return table.concat(parts, ";") | return table.concat(parts, ";") | ||
end | end | ||
| Строка 100: | Строка 138: | ||
local item = mw.text.trim(part) | local item = mw.text.trim(part) | ||
if item ~= "" then | if item ~= "" then | ||
result[#result + 1] = item | |||
end | end | ||
end | end | ||
| Строка 154: | Строка 192: | ||
local parents = getParents(entry) | local parents = getParents(entry) | ||
if whitelistSet | if whitelistSet and not hasAnyParent(parents, whitelistSet) then | ||
return false | |||
end | end | ||
| Строка 179: | Строка 215: | ||
return result | return result | ||
end | end | ||
| Строка 257: | Строка 224: | ||
spriteGroups[key] = spriteGroups[key] or {} | spriteGroups[key] = spriteGroups[key] or {} | ||
spriteGroups[key][#spriteGroups[key] + 1] = { id = id, entry = entry } | |||
end | end | ||
| Строка 268: | Строка 235: | ||
for _, obj in ipairs(group) do | for _, obj in ipairs(group) do | ||
local id = obj.id | local id = obj.id | ||
local prefix = | 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 = | local prefix = (project ~= "" and JsonPaths.has(firstId, project)) and (project .. ":") or "" | ||
local | |||
local spritePath = getSpritePath(firstEntry) | |||
local spriteValue = "" | |||
if spritePath then | |||
spriteValue = buildSpriteLink(baseUrl, spritePath) | |||
local stateName = getPrimaryState(firstEntry) | |||
"{{Entity Sprite/Repeat| | if stateName and stateName ~= "" then | ||
spriteValue = spriteValue .. " (" .. buildStateLink(baseUrl, spritePath, stateName) .. ")" | |||
end | |||
end | |||
result[#result + 1] = renderTemplate( | |||
"{{Entity Sprite/Repeat|файлы=" .. table.concat(idLinks, " ") .. | |||
"|перенаправление=" .. prefix .. firstId .. | "|перенаправление=" .. prefix .. firstId .. | ||
"|id=" .. firstId .. | "|id=" .. firstId .. | ||
"|спрайт=" .. spriteValue .. | "|спрайт=" .. spriteValue .. | ||
"}}" | "}}" | ||
) | |||
end | end | ||
end | end | ||
| Строка 297: | Строка 274: | ||
end | end | ||
local prefix = | local prefix = (project ~= "" and JsonPaths.has(id, project)) and (project .. ":") or "" | ||
local | local stateLinks = buildStateLinks(entry, baseUrl) | ||
local stateStr = "" | local stateStr = stateLinks and table.concat(stateLinks, ", ") or "" | ||
return renderTemplate( | |||
return | |||
"{{Entity Sprite/Image|файл=" .. prefix .. id .. | "{{Entity Sprite/Image|файл=" .. prefix .. id .. | ||
"|id=" .. id .. | "|id=" .. id .. | ||
| Строка 350: | Строка 316: | ||
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 = {} | ||
| Строка 357: | Строка 322: | ||
local t = generateTemplate(id, entry, baseUrl, project) | local t = generateTemplate(id, entry, baseUrl, project) | ||
if t then | if t then | ||
result[#result + 1] = t | |||
end | end | ||
end | end | ||