Module:KnightBot4/SpriteSub

Jump to navigation Jump to search

This module implements {{User:KnightBot4/Sprite}}

[view] [edit] [history] [refresh]The above documentation is transcluded from Module:KnightBot4/SpriteSub/doc.
local p = {}

function p.sub( f )
	local args = f
	if mw.getCurrentFrame() == f then
		args = f:getParent().args
	end
	local name = args.name
	
	-- Find the name of the sprite sheet
	local module, sprite
	if name:find( 'Sprite' ) then
		module = 'Module:' .. mw.text.trim( name ) .. '/IDs'
		sprite = true
	else
		module = 'Module:' .. name:gsub( '^(.-)Link.*$', '%1Sprite/IDs' )
	end
	local ids = {}
	local names = {}

	-- if the sprite template does not have a sprite module with the standard name, skip it
	if mw.title.new( module ).exists then
		ids = mw.loadData( module ).ids or {} -- just in case

		-- Inverting the table into a "number = name" format
		for id, data in pairs( ids ) do
			if not data.deprecated then
				local num = data.pos
				if not names[num] then
					names[num] = {}
				end
				table.insert( names[num], id )
			end
		end
	end
	
	-- figure out information about the sprite
	local id = args.id or args[1]
	local idData = ids[id] or ids[mw.ustring.lower( id ):gsub( '[%s%+]', '-' )]
	
	-- if the sprite is deprecated
	if idData and idData.deprecated then
		local id = idData.pos
		if args.id then
			-- check all available names for the number to see if any match args[1]
			local check = mw.ustring.lower( args[1] ):gsub( '[%s%+]', '-' )
			for _, v in ipairs( names[id] ) do
				if args[1] == v or check == v then
					args.id = nil
					break
				end
			end
			
			-- if none do, then pull the first name, or if none exist return the original deprecated sprite
			if args.id then
				args.id = names[id] and names[id][1] or args.id
			end
		else
			-- only set args[1] if we are using sprite mode, otherwise set the id
			if sprite then
				args[1] = names[id] and names[id][1] or args[1]
			else
				args.id = names[id] and names[id][1] or nil
			end
		end
	end
	
	-- Return the added args
	local outArgs = {}
	local argTypes = { 'id', 'link', 1, 2, 'text' }
	for _, arg in ipairs( argTypes ) do
		if args[arg] then
			if arg == 1 or arg == 2 then
				table.insert( outArgs, args[arg] )
			else
				table.insert( outArgs, arg .. '=' .. args[arg] )
			end
		end
	end

	return '{{' .. name .. '|' .. table.concat( outArgs, '|' ) .. '}}'
end

return p