Перейти к содержанию

Модуль:Инвентарная иконка

Материал из LemonCraft Wiki

Для документации этого модуля может быть создана страница Модуль:Инвентарная иконка/doc

local p = {}

local tryLoadData = require([[Модуль:Специальные утилиты]]).tryLoadData

function splitExtension(name)
	if name:match('%.gif$') or name:match('%.png$') then
		-- расширения англоязычные, представляют собой ASCII-символы,
		-- поэтому обычные match и sub безопасны
		return name:sub(0, -5), name:sub(-3)
	elseif name:match('%.webp$') then
		return name:sub(0, -6), 'webp'
	else
		return name, nil
	end
end

function p.icon(f)
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	end
	
	-- Параметры
	local name = mw.text.trim(args[1] or '')
	local link = mw.text.trim(args["ссылка"] or '')
	local title = mw.text.trim(args["назв"] or '')
	local mod = mw.text.trim(args["мод"] or '')
	
	-- Полное название файла
	local extension
	name, extension = splitExtension(name)
	
	local icon, category
	if mod == '' then
		-- Ванильная иконка
		
		-- Ищем файл из общего хранилища
		-- Попытка найти англоназвание в псевдонимах
		local aliases = mw.loadData([[Модуль:Инвентарный слот/Псевдонимы]])
		local alias = aliases[name]
		local englishName
		if alias and not alias[1] then
			if type(alias.commons) == "string" then
				-- переданное шаблону расширение имеет приоритет над тем,
				-- что задано в псевдонимах
				local enExtension
				englishName, enExtension = splitExtension(alias.commons)
				extension = extension or enExtension
			elseif alias.commons ~= false then
				englishName = alias.english
			end
		end
		
		-- Если англоназвания в псевдонимах нет, ищем в отдельном модуле
		if not englishName then
			local englishNames = mw.loadData([[Модуль:Инвентарный слот/Англоязычные названия]])
			englishName = englishNames[name]
		end
		
		if englishName then
			icon = table.concat{
				'[[Файл:Invicon ', englishName, '.', extension or 'png',
				'|32x32px|class=pixel-image|link=', link, '|', title, ']]'
			}
		else
			-- Ищем в таблице спрайтов
			local spriteData = mw.loadData([[Модуль:ИнвСпрайт]])
			local idData = spriteData["IDы"][name]
			if idData then
				icon, category = require([[Модуль:Спрайт]]).sprite{
					["данныеID"] = idData, ["ссылка"] = link, ["назв"] = title,
					["данные"] = "ИнвСпрайт"
				}
			else
				-- Ванильный локальный Grid-файл
				icon = table.concat{
					'[[Файл:Grid ', name, '.', extension or 'png',
					'|32x32px|class=pixel-image|link=', link, '|', title, ']]'
				}
			end
		end
	else
		-- Иконка из модификации
		
		-- Разбор сокращений
		local mods = mw.loadData([[Модуль:Модификации]])
		mod = mods[mod] or mod
		
		-- Загрузка таблицы спрайтов
		local spriteData = tryLoadData("Модуль:ИнвСпрайт/" .. mod)
		
		-- Находим данные о спрайте
		local idData
		if spriteData then
			local idsOverride = spriteData["настройки"]["списокID"]
			idsOverride = idsOverride and tryLoadData("Модуль:" .. idsOverride)
			
			local ids = (idsOverride or spriteData)["IDы"]
			if ids then
				idData = ids[name]
			end
		end
		
		if idData then
			icon, category = require([[Модуль:Спрайт]]).sprite{
				["данныеID"] = idData, ["ссылка"] = link, ["назв"] = title,
				["данные"] = "ИнвСпрайт/" .. mod
			}
		else
			-- Локальный Grid-файл
			icon = table.concat{
				'[[Файл:Grid ', name, ' (', mod, ').', extension or 'png',
				'|32x32px|class=pixel-image|link=', link, '|', title, ']]'
			}
		end
	end
	return icon, category
end

return p