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

Нет описания правки
Нет описания правки
Строка 1: Строка 1:
local p = {}
local p = {}
local JsonPaths = require('Module:JsonPaths')
local JsonPaths = require('Module:JsonPaths')
local fileExistsCache = {}


local function getSpritePath(entry)
local function getSpritePath(entry)
    return entry.sprite
return entry.sprite
end
end


local function getSpriteStates(entry)
local function getSpriteStates(entry)
    local result = {}
local result = {}


    if entry.layers and entry.sprite then
if entry.layers and entry.sprite then
        for _, layer in ipairs(entry.layers) do
for _, layer in ipairs(entry.layers) do
            if layer.visible ~= false then
if layer.visible ~= false then
                table.insert(result, {
table.insert(result, {
                    state = tostring(layer.state or entry.state or ""),
state = tostring(layer.state or entry.state or ""),
                    sprite = entry.sprite
sprite = entry.sprite
                })
})
            end
end
        end
end
    elseif entry.state and entry.sprite then
elseif entry.state and entry.sprite then
        table.insert(result, {
table.insert(result, {
            state = tostring(entry.state or ""),  
state = tostring(entry.state or ""),
            sprite = entry.sprite
sprite = entry.sprite
        })
})
    end
end


    return (#result > 0) and result or nil
return (#result > 0) and result or nil
end
end


local function getPrefix(id, project)
local function getPrefix(id, project)
    if project ~= "" and JsonPaths.has(id, project) then
if project ~= "" and JsonPaths.has(id, project) then
        return project .. ":"
return project .. ":"
    end
end
    return ""
return ""
end
end


local function fileExists(name)
local function batchFileExists(names)
    local title = mw.title.new(name, "File")
local result = {}
    return title and title.exists
local batch = {}
local seen = {}
 
local function flush()
if #batch == 0 then
return
end
 
local titles = mw.title.newBatch(batch, 6):lookupExistence():getTitles()
for i, title in ipairs(titles) do
local name = batch[i]
fileExistsCache[name] = title and title.exists or false
end
 
batch = {}
seen = {}
end
 
for _, name in ipairs(names) do
if fileExistsCache[name] == nil and not seen[name] then
seen[name] = true
table.insert(batch, name)
 
if #batch == 25 then
flush()
end
end
end
 
flush()
 
for _, name in ipairs(names) do
result[name] = fileExistsCache[name] or false
end
 
return result
end
end


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


    for id, entry in pairs(data) do
for id, entry in pairs(data) do
        local found = false
local found = false


        for _, group in pairs(spriteGroups) do
for _, group in pairs(spriteGroups) do
            local g = group[1]
local g = group[1]


            if entry.sprite == g.entry.sprite and entry.state == g.entry.state then
if entry.sprite == g.entry.sprite and entry.state == g.entry.state then
                table.insert(group, { id = id, entry = entry })
table.insert(group, { id = id, entry = entry })
                found = true
found = true
                break
break
            end
end
        end
end


        if not found then
if not found then
            table.insert(spriteGroups, {
table.insert(spriteGroups, {
                { id = id, entry = entry }
{ id = id, entry = entry }
            })
})
        end
end
    end
end


    local result = {}
local result = {}


    for _, group in pairs(spriteGroups) do
for _, group in pairs(spriteGroups) do
        if #group > 1 then
if #group > 1 then
            local idLinks = {}
local idLinks = {}


            for _, obj in pairs(group) do
for _, obj in pairs(group) do
                local id = obj.id
local id = obj.id
                local prefix = getPrefix(id, project)
local prefix = getPrefix(id, project)


                table.insert(idLinks, "[[:Файл:" .. prefix .. id .. ".png]]")
table.insert(idLinks, "[[:Файл:" .. prefix .. id .. ".png]]")
            end
end


            table.insert(result, mw.getCurrentFrame():preprocess(
table.insert(result, mw.getCurrentFrame():preprocess(
                "{{Entity Sprite/Repeat|" ..
"{{Entity Sprite/Repeat|" ..
                table.concat(idLinks, " ") ..
table.concat(idLinks, " ") ..
                "|" .. group[1].id ..
"|" .. group[1].id ..
                "}}"
"}}"
            ))
))
        end
end
    end
end


    return table.concat(result, "\n")
return table.concat(result, "\n")
end
end


local function generateTemplate(id, entry, baseUrl, project)
local function generateTemplate(id, entry, baseUrl, project)
    local spritePath = getSpritePath(entry)
local spritePath = getSpritePath(entry)
    if not id or not spritePath then
if not id or not spritePath then
        return nil
return nil
    end
end


    local prefix = getPrefix(id, project)
local prefix = getPrefix(id, project)


    local states = getSpriteStates(entry)
local states = getSpriteStates(entry)
    local stateStr = ""
local stateStr = ""


    if states then
if states then
        local links = {}
local links = {}
        for _, item in ipairs(states) do
for _, item in ipairs(states) do
            local url = baseUrl .. item.sprite .. "/" .. item.state .. ".png"
local url = baseUrl .. item.sprite .. "/" .. item.state .. ".png"
            table.insert(links, "[" .. url .. " " .. item.state .. "]")
table.insert(links, "[" .. url .. " " .. item.state .. "]")
        end
end
        stateStr = table.concat(links, ", ")
stateStr = table.concat(links, ", ")
    end
end


    return mw.getCurrentFrame():preprocess(
return mw.getCurrentFrame():preprocess(
        "{{Entity Sprite/Image|файл=" .. prefix .. id ..
"{{Entity Sprite/Image|файл=" .. prefix .. id ..
        "|id=" .. id ..
"|id=" .. id ..
        "|путь=" .. baseUrl .. spritePath ..
"|путь=" .. baseUrl .. spritePath ..
        "|state=" .. stateStr ..
"|state=" .. stateStr ..
        "}}"
"}}"
    )
)
end
end


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 "sprite_entity.json"
    local checkFile = frame.args.checkFile or ""
local checkFile = frame.args.checkFile or ""
    if checkFile == "" then checkFile = false end
if checkFile == "" then checkFile = false end
   
 
    local project = JsonPaths.project()
local project = JsonPaths.project()
    local baseUrl = JsonPaths.git() .. "/Resources/Textures/"
local baseUrl = JsonPaths.git() .. "/Resources/Textures/"
    local dataPage = JsonPaths.get(json)
local dataPage = JsonPaths.get(json)
    local spriteData = mw.loadData(dataPage)
local spriteData = mw.loadData(dataPage)
 
if not spriteData or type(spriteData) ~= "table" then
return "Ошибка загрузки JSON: " .. dataPage
end


    if not spriteData or type(spriteData) ~= "table" then
if action == "repeat" then
        return "Ошибка загрузки JSON: " .. dataPage
return generateRepeatTemplate(spriteData, project)
    end


    if action == "repeat" then
elseif action == "image" then
        return generateRepeatTemplate(spriteData, project)
local items = {}
local fileNames = {}


    elseif action == "image" then
for id, entry in pairs(spriteData) do
        local result = {}
local prefix = getPrefix(id, project)
local fileName = prefix .. id .. ".png"


        for id, entry in pairs(spriteData) do
table.insert(items, {
            local prefix = getPrefix(id, project)
id = id,
entry = entry,
fileName = fileName
})


if checkFile then
table.insert(fileNames, fileName)
end
end
local existsMap = nil
if checkFile then
existsMap = batchFileExists(fileNames)
end
local result = {}
for _, item in ipairs(items) do
local skip = false
local skip = false
 
if checkFile then
if checkFile and existsMap[item.fileName] then
    local fileName = prefix .. id .. ".png"
skip = true
    if fileExists(fileName) then
        skip = true
    end
end
end
 
if not skip then
if not skip then
    local t = generateTemplate(id, entry, baseUrl, project)
local t = generateTemplate(item.id, item.entry, baseUrl, project)
    if t then
if t then
        table.insert(result, t)
table.insert(result, t)
    end
end
end
end
        end
end


        return table.concat(result, "\n")
return table.concat(result, "\n")
    end
end


    return nil
return nil
end
end


return p
return p