Moduł:Inventory slot

Z Minecraft Wiki Polska
Wersja z dnia 16:34, 16 kwi 2021 autorstwa Ksawi999 (dyskusja | edycje) (Koniec męczarni z wypisywaniem każdego koloru! Wystarczy, że wpiszesz dowolny lub jakikolwiek, a program sam zrobi kolory! Zajęło mi to bardzo dużo czasu ale oszczędzi jeszcze więcej! (możliwe, że spowodowało to jakieś błedy))
Przejdź do nawigacji Przejdź do wyszukiwania

Ten moduł jest wywoływany przez szablon {{Grid}}.

Zależności

-------------------------------------------------------------------
--- Moduł do wyświetlania ikon przedmiotów jak w ekwipunku. 
-------------------------------------------------------------------

local p = {}

-- Lista przedrostków nazw przetwarzanych przez inne moduły.
-- Ułatwi to na przykład usuwanie ich z celów linków.
-- UWAGA: należy wskazywać wszystkie warianty deklinacji według płci i liczby.
p.prefixes = {
	'Jakiekolwiek', 'Jakikolwiek', 'Jakakolwiek',
	'Uszkodzone', 'Uszkodzony', 'Uszkodzona'
}

p.modAliases = {
	["thaum"] = "ThaumCraft",
	["bc"] = "BuildCraft"
}

--- Tworzenie slotów
function p.slot(f)
	--- Pozyskiwanie argumentów
	local args = f.args or f
	if f == mw.getCurrentFrame() and args[1] == nil then
		args = f:getParent().args
	end
	
	-- Pierwszy argument
	args[1] = mw.text.trim(args[1] or '')
	
	--- Skróty
	-- Możesz skomentować następujący wiersz, jeśli nie używasz aliasów
--	local aliases = mw.loadData('Moduł:Inventory slot/Aliases')
	
	local modAliases = args["aliasyModow"] or ''
	if modAliases ~= '' then
		modAliases = mw.loadData('Moduł:' .. modAliases)
	else
		modAliases = nil
	end
	
	if aliases or modAliases then
		local frames = {}
		for frame in mw.text.gsplit( args[1], '%s*;%s*' ) do
			local frameParts = p.getParts( frame, args["mod"] )
			
			local id = frameParts.name
			if frameParts.mod then
				id = frameParts.mod .. ':' .. id
			end
			
			local alias
			if modAliases and modAliases[id] then
				alias = modAliases[id]
			elseif aliases and aliases[id] then
				alias = aliases[id]
			end
			
			if alias then
				table.insert( frames, p.expandAlias( frameParts, alias ) )
			else
				table.insert( frames, frame )
			end
		end
		
		args[1] = table.concat( frames, ';' )
	end
	
	--- Tworzenie spriteów
	
	-- Opcje
	local sprite
	local ids = mw.loadData([[Moduł:InvSprite/IDs]])["ids"]
	local modIds = {}
	local back_modIds = {}
	local animated = mw.ustring.find(args[1], ';')
	local pageName = mw.title.getCurrentTitle().text
	local imgClass = args["klasa obrazu"]
	local numStyle = args["styl numerów"]
	
	local body = mw.html.create('span'):css{['vertical-align'] = args["wyrówn"]}
	
	if animated then
		body:addClass('animated')
	end
	if args["klasa"] then
		body:addClass(args["klasa"])
	end
		body:addClass('invslot')
	if args["styl"] then
		body:cssText(args["styl"])
	end
	
	if (args["domyślne"] or '') ~= '' then
		body:css('background-image', '{{FileUrl|' .. args["domyślne"] .. '.png}}')
	end

    --- sprity w tle
	if (args["domyślneCSS"] or '') ~= '' then
        local mod=args["mod"]
		if mod then
			local back_modData = back_modIds[mod]
			if not back_modData and mw.title.new('Moduł:TłoSprit/' .. mod .. '/ID').exists then
				back_modData = mw.loadData('Moduł:TłoSprit/' .. mod .. '/ID')
				back_modIds[mod] = back_modData
			end
			if back_modData then
				param = mw.loadData('Moduł:TłoSprit/' .. mod)
				local n = args["domyślneCSS"]
				local pos = back_modData[n] - 1
				local size = param["wielkość"]
				local tiles = param["format"] / size
				local left = pos % tiles * size
				local top = math.floor( pos / tiles ) * size
		
				body:css('background-image', '{{FileUrl|' .. mod .. 'CSS.png}}')
				body:css('background-size', 'auto')
				body:css('background-position', '-' .. left .. 'px -' .. top ..'px')
			end
		end		
	end
	
	--- Obsługa przedrostka "jakikolwiek" i "dowolny"
	while string.find(args[1], 'Dowoln[yea]') or string.find(args[1], 'Jak[ia]kolwiek') or string.find(args[1], 'Jakiekolwiek') do
		local current = string.sub(args[1], string.find(args[1], 'Dowoln[yea]') or string.find(args[1], 'Jak[ia]kolwiek') or string.find(args[1], 'Jakiekolwiek'))
		current = string.sub(current, 1, string.find(';') or string.len(current))
		local prefix = string.sub(current, 1, string.find(' '))
		current = string.sub(current, string.find(' '))
		local replacement = ''
		if prefix == 'Dowolny' or prefix == 'Jakikolwiek' then
			replacement = 'Czerwony'..current..';Pomarańczowy'..current..';Żółty'..current..';Jasnozielony'..current..';Zielony'..current..';Błekitny'..current..';Jasnoniebieski'..current..';Niebieski'..current..';Fioletowy'..current..';Karmazynowy'..current..';Różowy'..current..';Brązowy'..current..';Czarny'..current..';Szary'..current..';Jasnoszary'..current..';Biały'..current..';'
		end
		if prefix == 'Dowolna' or prefix == 'Jakakolwiek' then
			replacement = 'Czerwona'..current..';Pomarańczowa'..current..';Żółta'..current..';Jasnozielona'..current..';Zielona'..current..';Błekitna'..current..';Jasnoniebieski'..current..';Niebieski'..current..';Fioletowa'..current..';Karmazynowa'..current..';Różowa'..current..';Brązowa'..current..';Czarna'..current..';Szara'..current..';Jasnoszara'..current..';Biała'..current..';'
		else replacement = 'Czerwone'..current..';Pomarańczowe'..current..';Żółte'..current..';Jasnozielone'..current..';Zielone'..current..';Błekitne'..current..';Jasnoniebieski'..current..';Niebieski'..current..';Fioletowe'..current..';Karmazynowe'..current..';Różowe'..current..';Brązowe'..current..';Czarne'..current..';Szare'..current..';Jasnoszare'..current..';Białe'..current..';'
		end
		args[1] = string.sub(args[1],1,string.find(args[1], 'Dowoln[yea]') or string.find(args[1], 'Jak[ia]kolwiek') or string.find(args[1], 'Jakiekolwiek'))..replacement..string.sub(args[1],string.find(current))
	end
	
	--- Obsługa klatek
	local first = true
	for frame in mw.text.gsplit(args[1], '%s*;%s*') do
		local item
		if frame ~= '' or frame == '' and animated then
			item = body:tag('span'):addClass('invslot-item')
			if imgClass then
				item:addClass(imgClass)
			end
		end
		
		if frame == '' then
			(item or body):tag('br')
		else
			local category
			local parts = p.getParts(frame, args["mod"])
			local title = parts.title or mw.text.trim(args["title"] or '')
			local mod = parts.mod
			local name = parts.name
			local num = parts.num
			local description = parts.text
			
			local img, idData
			if mod then
				local modData = modIds[mod]
				if not modData and mw.title.new('Moduł:InvSprite/' .. mod .. '/ID').exists then
					modData = mw.loadData('Moduł:InvSprite/' .. mod .. '/ID')["IDы"]
					modIds[mod] = modData
				end
				if modData and modData[name] then
					idData = modData[name]
				else
					img = name .. ' (' .. mod .. ')'
				end
			elseif ids[name] then
				idData = ids[name]
			else
				img = name
			end
			
			local link = args["link"] or ''
			if link == '' then
				if mod then
					link = mod .. '/' .. name
				else
					link = mw.ustring.gsub(name, '^Uszkodzon[yea] ', '')
				end
			elseif mw.ustring.lower(link) == 'nie' then
				link = nil
			end
			if link == pageName then
				link = nil
			end
			
			local formattedTitle
			local plainTitle
			if title == '' then
				plainTitle = name
			elseif mw.ustring.lower(title) ~= 'nie' then
				plainTitle = mw.ustring.gsub(mw.ustring.gsub(title, '\\\\', '\'), '\\&', '&')
				
				local formatPattern = '&[0-9a-fk-or]'
				if mw.ustring.match(plainTitle, formatPattern) then
					formattedTitle = title
					plainTitle = mw.ustring.gsub(plainTitle, formatPattern, '')
				end
				
				if plainTitle == '' then
					plainTitle = name
				else
					plainTitle =  mw.ustring.gsub(mw.ustring.gsub(plainTitle, '\', '\\'), '&', '&')
				end
			elseif link then
				if img then
					formattedTitle = ''
				else
					plainTitle = ''
				end
			end
			
			item:attr{
				['data-minetip-title'] = formattedTitle,
				['data-minetip-text'] = description
			}
			
			if img then
				--- Obsługa rozszerzeń
				local extension = ''
				if mw.title.new('File:Grid '..img..'.gif').exists then
					extension = '.gif'
				else
					extension = '.png'
				end
				-- & jest ponownie zmieniany, ponieważ mw.html traktuje atrybuty
				-- jako zwykły tekst, ale MediaWiki tego nie robi
				local escapedTitle = ( plainTitle or '' ):gsub( '&', '&' )
				item:addClass('invslot-item-image')
					:wikitext('[[File:Grid ', img, extension, '|32x32px|link=', link or '', '|', escapedTitle, ']]')
			else
				if not sprite then
					sprite = require([[Moduł:Sprite]]).sprite
				end
				local image
				if mod then
					image = (args["tablica Ikonek"] or mod or "Inv") .. 'CSS.png'
				end
				if link then
					item:wikitext('[[', link, '|')
				end

				local image, spriteCat;
				if not mod then
				    image, spriteCat = sprite{
					    ["danychID"] = idData, ["title"] = plainTitle,
					    ["obraz"] = image, ["ustawienia"] = 'InvSprite'
					    }
				else 
				    image, spriteCat = sprite{
					    ["danychID"] = idData, ["title"] = plainTitle,
					    ["obraz"] = image, ["ustawienia"] = 'InvSprite/' .. mod
					    }
				end
				item:node(image)
				category = spriteCat
			end
			
			if num and num > 1 and num < 1000 then
				if img and link then
					item:wikitext('[[', link, '|')
				end
				local number = item
					:tag('span')
						:addClass('invslot-stacksize')
						:attr{title = plainTitle}
						:wikitext(num)
				if numStyle then
					number:cssText(numStyle)
				end
				if img and link then
					item:wikitext(']]')
				end
			end
			
			if idData and link then
				item:wikitext(']]')
			end
			
			item:wikitext(category)
		end
		
		if first then
			if animated and item then
				item:addClass('active')
			end
			first = false
		end
	end
	
	return tostring( body )
end

function p.expandAlias( frameParts, alias )
	-- Jeśli ramka nie ma części, możemy po prostu zwrócić alias bez zmian
	--[[if not frameParts.title and not frameParts.mod and not frameParts.num and not frameParts.text then
		return alias
	end--]]
	
	local expandedFrames = {}
	for aliasFrame in mw.text.gsplit(alias, '%s*;%s*') do
		local aliasParts = p.getParts(aliasFrame)
		aliasParts.title = frameParts.title or aliasParts.title or ''
		aliasParts.mod = frameParts.mod or aliasParts.mod or 'Minecraft'
		aliasParts.num = frameParts.num or aliasParts.num or ''
		aliasParts.text = frameParts.text or aliasParts.text or ''
		
		table.insert(expandedFrames, mw.ustring.format(
			'[%s]%s:%s,%s[%s]',
			aliasParts.title, aliasParts.mod, aliasParts.name, aliasParts.num, aliasParts.text
		))
	end
	
	return table.concat(expandedFrames, ';')
end


function p.getParts(frame, mod)
----Funkcja pobiera nazwę pozycji w formacie "[tytuł] mod: nazwa [tekst], numer"
----parts.title = tytuł, nazwa przedmiotu po najechaniu myszą
----parts.mod = mod
----parts.name = Nazwa
----parts.text = tekst, dodatkowy tekst po najechaniu kursorem na element
----parts.num = numer

	local parts = {}
	parts.title = mw.ustring.match(frame, '^%[%s*([^%]]+)%s*%]')
	
    local modPattern
    if mw.ustring.match(frame, '^%[.*%]([a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŻŹа-яА-Я0-9 _-]+):') then
    modPattern = '^%[.*%]([a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŻŹа-яА-Я0-9 _-]+):'
    else
    modPattern = '^([a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŻŹа-яА-Я0-9 _-]+):'
    end

	parts.mod = mw.text.trim(mw.ustring.match(frame, modPattern) or mod or '') ---- Uzyskaj nazwę modyfikacji
	
	local vanilla = {v = 1, vanilla = 1, mc = 1, minecraft = 1}
	if parts.mod == '' or vanilla[mw.ustring.lower(parts.mod)] then
		parts.mod = nil
	end
	if p.modAliases[parts.mod] then
		parts.mod = p.modAliases[parts.mod]
	end

	local _, nameStartV = mw.ustring.find( frame, '^%[[^%]]*%]' )
	local nameStart = ( ({mw.ustring.find( frame, modPattern )})[2] or nameStartV or 0 ) + 1
	if nameStart - 1 == #frame then
		nameStart = 1
	end
	parts.name = mw.text.trim( mw.ustring.sub( frame, nameStart, ( mw.ustring.find( frame, '[,%[]', nameStart ) or 0 ) - 1 ) )
	
	parts.num = math.floor(mw.ustring.match(frame, ',%s*(%d+)') or 0)
	if parts.num == 0 then
		parts.num = nil
	end
	
	parts.text = mw.ustring.match(frame, '%[%s*([^%]]+)%s*%]$')
	
	return parts
end
 
return p