|
|
Строка 1: |
Строка 1: |
| | local data = mw.loadData("Module:Entity Sprite/data") -- Загружаем предобработанные данные |
| | |
| local p = {} | | local p = {} |
|
| |
|
| -- Загружаем данные из модуля | | -- Получаем таблицу данных |
| local data = mw.loadData("Модуль:Entity Sprite/data")
| | function p.getData() |
| | | return data |
| -- Проверка равенства двух таблиц
| |
| local function deepEqual(t1, t2)
| |
| if t1 == t2 then return true end
| |
| if type(t1) ~= "table" or type(t2) ~= "table" then return false end
| |
|
| |
| -- Если это массивы, проверяем их содержимое без учета порядка
| |
| local function isArray(t)
| |
| local i = 0
| |
| for _ in pairs(t) do
| |
| i = i + 1
| |
| if t[i] == nil then return false end
| |
| end
| |
| return true
| |
| end
| |
| if isArray(t1) and isArray(t2) then
| |
| if #t1 ~= #t2 then return false end
| |
| local matched = {}
| |
| for _, v1 in ipairs(t1) do
| |
| local found = false
| |
| for j, v2 in ipairs(t2) do
| |
| if not matched[j] and deepEqual(v1, v2) then
| |
| matched[j] = true
| |
| found = true
| |
| break
| |
| end
| |
| end
| |
| if not found then return false end
| |
| end
| |
| return true
| |
| end
| |
|
| |
| -- Если это таблицы, проверяем их содержимое
| |
| for k, v in pairs(t1) do
| |
| if t2[k] == nil or not deepEqual(v, t2[k]) then
| |
| return false
| |
| end
| |
| end
| |
| for k, v in pairs(t2) do
| |
| if t1[k] == nil then
| |
| return false
| |
| end
| |
| end
| |
| return true
| |
| end
| |
| | |
| -- Получение пути спрайта
| |
| local function getSpritePath(entry)
| |
| if entry.Sprite and entry.Sprite.sprite then
| |
| return entry.Sprite.sprite
| |
| elseif entry.Icon and entry.Icon.sprite then
| |
| return entry.Icon.sprite
| |
| elseif entry.Sprite and entry.Sprite.layers then
| |
| for _, layer in ipairs(entry.Sprite.layers) do
| |
| if layer.sprite then
| |
| return layer.sprite
| |
| end
| |
| end
| |
| end
| |
| return nil | |
| end | | end |
|
| |
|
| -- Генерация шаблона repeat | | -- Получаем спрайт по ID |
| local function generateRepeatTemplate()
| | function p.getSprite(frame) |
| local spriteGroups = {} | | local id = frame.args[1] |
| for _, entry in ipairs(data) do
| | if not id then return "Ошибка: не указан ID" end |
| local found = false
| |
| for _, group in pairs(spriteGroups) do
| |
| if deepEqual(entry.Sprite, group[1].Sprite) and
| |
| deepEqual(entry.EntityStorageVisuals, group[1].EntityStorageVisuals) and
| |
| deepEqual(entry.Icon, group[1].Icon) then
| |
| table.insert(group, entry)
| |
| found = true
| |
| break
| |
| end
| |
| end
| |
| if not found then
| |
| spriteGroups[entry.id] = {entry}
| |
| end
| |
| end
| |
| | |
| local result = {}
| |
| for _, group in pairs(spriteGroups) do
| |
| if #group > 1 then
| |
| local idLinks = {}
| |
| for _, entry in ipairs(group) do
| |
| table.insert(idLinks, "[[:Файл:" .. entry.id .. ".png]]")
| |
| end
| |
| local firstId = group[1].id
| |
| table.insert(result, mw.getCurrentFrame():preprocess("{{Entity Sprite/Repeat|" .. table.concat(idLinks, " ") .. "|" .. firstId .. "}}"))
| |
| end
| |
| end
| |
| return table.concat(result, "\n")
| |
| end | |
|
| |
|
| -- Создание индекса путей спрайтов
| |
| local function createSpritePathIndex()
| |
| local index = {}
| |
| for _, entry in ipairs(data) do | | for _, entry in ipairs(data) do |
| local spritePath = getSpritePath(entry)
| | if entry.id == id then |
| if spritePath then | | return entry.Sprite and entry.Sprite.sprite or "Ошибка: спрайт не найден" |
| index[spritePath] = entry.id
| |
| end
| |
| end
| |
| return index
| |
| end
| |
| | |
| -- Генерация шаблона по параметрам
| |
| local function generateTemplate(entry, param, secondaryParam, spritePathIndex)
| |
| local spritePath = getSpritePath(entry)
| |
| if not entry.id or not spritePath then
| |
| return nil
| |
| end
| |
| | |
| if param == "image" then
| |
| if secondaryParam and tostring(entry.id) == tostring(secondaryParam) then
| |
| return spritePath | |
| else
| |
| return mw.getCurrentFrame():preprocess("{{Entity Sprite/Image|" .. entry.id .. "|" .. spritePath .. "}}")
| |
| end
| |
| elseif param == "path" then
| |
| if secondaryParam then
| |
| return spritePathIndex[secondaryParam] or nil
| |
| else
| |
| return mw.getCurrentFrame():preprocess("{{Entity Sprite/Path|" .. entry.id .. "|" .. spritePath .. "}}")
| |
| end
| |
| end
| |
| return nil
| |
| end
| |
| | |
| -- Генерация шаблона по умолчанию
| |
| local function generateDefaultTemplate(params)
| |
| local id = params.Id
| |
| local description = params.Description or ""
| |
| local servers = params.Servers or ""
| |
| local source = params.Source or ""
| |
| local tags = params.Tags or ""
| |
| local path = params.Path
| |
| | |
| local entry = nil
| |
| if id and id ~= "" then
| |
| for _, item in ipairs(data) do
| |
| if tostring(item.id) == tostring(id) then
| |
| entry = item
| |
| break
| |
| end
| |
| end
| |
| end
| |
| | |
| if entry then
| |
| local spritePath = getSpritePath(entry)
| |
| if not spritePath then
| |
| return ""
| |
| end
| |
| if not path or path == "" then
| |
| path = "Resources/Textures/" .. spritePath
| |
| end | | end |
| end | | end |
|
| |
|
| return mw.getCurrentFrame():preprocess( | | return "Ошибка: ID не найден" |
| "{{Файл\n" ..
| |
| "|Описание = " .. description .. "\n" ..
| |
| "|Id = " .. id .. "\n" ..
| |
| "|Сервера = " .. servers .. "\n" ..
| |
| "|Источник = " .. source .. "\n" ..
| |
| "|Путь = " .. (path or "") .. "\n" ..
| |
| "|Теги = " .. tags .. "\n" ..
| |
| "}}\n"
| |
| )
| |
| end
| |
| | |
| function p.main(frame)
| |
| local param = frame.args[1]
| |
| local secondaryParam = frame.args[2]
| |
| local spritePathIndex = createSpritePathIndex()
| |
| | |
| if param == "repeat" then
| |
| return generateRepeatTemplate()
| |
| elseif param == "path" and secondaryParam then
| |
| for _, entry in ipairs(data) do
| |
| local template = generateTemplate(entry, param, secondaryParam, spritePathIndex)
| |
| if template then
| |
| return template
| |
| end
| |
| end
| |
| return nil
| |
| elseif param == "image" or param == "path" then
| |
| local result = {}
| |
| for _, entry in ipairs(data) do
| |
| local template = generateTemplate(entry, param, secondaryParam, spritePathIndex)
| |
| if template then
| |
| table.insert(result, template)
| |
| end
| |
| end
| |
| return table.concat(result, "\n")
| |
| else
| |
| return generateDefaultTemplate(frame.args)
| |
| end
| |
| end | | end |
|
| |
|
| return p | | return p |