Module:Characters

From Liquipedia Smash Wiki

Documentation (view - edit)

Module:Characters/doc


local p = {}

local Array = require('Module:Array')
local Game = require('Module:Game')
local Lua = require('Module:Lua')
local Namespace = require('Module:Namespace')
local String = require('Module:StringUtils')
local Variables = require('Module:Variables')

local charList = Lua.import('Module:CharacterStandardization', { loadData = true })
local gameList = Lua.import('Module:GameName/data', { loadData = true }).shortname

function p.standardize(frame)
	return p._standardize(frame.args[1])
end

function p.standardizeArray(frame)
	if not (frame.args and frame.args[1]) then
		return ''
	end

	local input = Array.parseCommaSeparatedString(frame.args[1])
	local output = ''

	if input[1]  then
		output = ''
		for i=1, #input do
			if String.isNotEmpty(input[i]) then
				output = output .. ',' .. (p._standardize(input[i]) or '')
			end
		end

		return output
	else
		return ''
	end
end

function p._standardize(charInput)
	if String.isNotEmpty(charInput) then
		local char = charInput

		-- remove whitespace
		char = String.trim(char)

		-- unstrip nowiki strip markers
		char = mw.text.unstripNoWiki(char)

		-- remove spaces
		char = char:gsub("%W+", "")

		-- lowercase
		char = char:lower()

		char = charList[char]

		if char then
			return char
		else
			mw.log('Unknown character abbreviation in standardize: ' .. charInput)
			return 'Unknown'
		end
	else
		return
	end
end

function p.GetIcon(CharacterIcons, character, large)
	if (character == nil) then
		return ''
	end

	-- Standardize the character name first
	local stdCharName = p._standardize(character)

	-- Then try to look it up
	local icon = CharacterIcons[stdCharName]
	if (icon ~= nil) then
		-- Size
		if (large) then
			icon = string.gsub(icon, '18x18px', '25x25px')
		end
		return icon
	else
		if character and stdCharName then
			mw.log('GetIcon failed: ' .. character, 'Standardized: ' .. stdCharName)
		elseif character then
			mw.log('GetIcon failed: ' .. character, 'Standardized: Not found')
		else
			mw.log('GetIcon failed: Nil, Standardized: Not found')
		end
		return CharacterIcons['Unknown'] .. ' [[Category:Pages with unknown character icons]]'
	end
end

function p.GetIconAndNameLua(icon, game)
	return p.GetIconAndName{icon, game}
end

function p.GetIconAndName(frame)
	local getArgs = require('Module:Arguments').getArgs
	local args = getArgs(frame)
	local CharacterIcons

	-- Argument 1 is character, argument 2 is game
	-- If a slash is used, what follows denotes the game (e.g. fox/melee)
	if args[2] then
		args.game = args[2]
	elseif args[1] and string.find(args[1], '/', 1, true) then
		local index = string.find(args[1], '/', 1, true)
		args.game = string.sub( args[1], index+1, -1 )
		args[1] = string.sub( args[1], 1, index-1 )
	end

	-- If no game is set, look for a variable
	args.game = args.game or Variables.varDefault('tournament_game')
	args.game = Game.toIdentifier{game = args.game}
	CharacterIcons = Lua.import('Module:CharacterIcons/' .. string.lower(args.game), { loadData = true })

	return p._GetIconAndName(CharacterIcons, args[1], args.large or false)
end

function p._GetIconAndName(CharacterIcons, character, large)
	if (character == nil) then
		return ''
	end

	-- Standardize the character name first
	local stdCharName = p._standardize(character)

	-- Then try to look it up
	local icon = p.GetIcon(CharacterIcons, stdCharName, large)

	-- Requested "Unknown" in the first place
	if character == 'Unknown' then
		return CharacterIcons['Unknown']
	-- Valid character requested
	elseif (stdCharName and stdCharName ~= 'Unknown') then
		icon = string.gsub(icon, '|link=]]', '|link=|' .. stdCharName .. ']]')
		return icon
	-- Fallback
	else
		mw.log('_GetIconAndName failed: ' .. character)
		return CharacterIcons['Unknown'] .. ' [[Category:Pages with unknown character icons]]'
	end
end

function p.InfoboxCharacter(frame)
	local getArgs = require('Module:Arguments').getArgs
	local args = getArgs(frame)
	local CharacterIcons

	if args[2] then
		args.game = args[2]
	end

	args.game = args.game or Variables.varDefault('tournament_game')
	args.game = Game.toIdentifier{game = args.game}
	CharacterIcons = Lua.import('Module:CharacterIcons/' .. args.game, { loadData = true })

	return p._InfoboxCharacter(CharacterIcons, args[1], args.game)
end

function p._InfoboxCharacter(CharacterIcons, character, game)
	if (character == nil) then
		return ''
	end

	local stdCharName = p._standardize(character)
	local icon = p.GetIcon(CharacterIcons, stdCharName)

	-- Only do this in mainspace
	if Namespace.isMain() then
		if (stdCharName ~= 'Unknown') then
			return icon .. ' ' .. stdCharName .. '[[Category:' .. stdCharName .. ' Players ' .. '(' .. gameList[tostring(game)] .. ')' .. ']]'
		else
			mw.log('_InfoboxCharacter failed: ' .. character, 'Standardized: ' .. stdCharName)
			return CharacterIcons['Unknown'] .. ' [[Category:Pages with unknown character icons]]'
		end
	else
		if (stdCharName ~= 'Unknown') then
			return icon .. ' ' .. stdCharName
		else
			mw.log('_InfoboxCharacter failed: ' .. character, 'Standardized: ' .. stdCharName)
			return CharacterIcons['Unknown'] .. ' [[Category:Pages with unknown character icons]]'
		end
	end
end

return p