Infobox 3DS Homebrews

From GameBrew

Documentation for this module may be created at Module:Infobox 3DS Homebrews/doc

local p = {}
local function empty(param)
	return not param or param == ''	

local function formatUser( user )
	return '[[User:' .. user .. (user:find('|') and '' or ('|' .. user)) .. ']]'
local function userList( list )
	if empty(list) then return end
	if not list:find(',') then
		return formatUser(list)	
	local ret = {}
	for user in mw.text.gsplit( list, '%s*,%s*' ) do
		ret[#ret+1] = formatUser(user)	
	return table.concat( ret, ', ' )
local function getType( type )
	if empty( type ) then return end
	local types = {
		-- Applications
		['media player']       = '[[List of 3DS homebrew applications#Media players|Media player]] [[Category:3DS Homebrew media players]]',
		['utility']            = '[[List of 3DS homebrew applications#Utilities|Utility]] [[Category:3DS Homebrew utilities]]',
		['operating system']   = '[[List of 3DS homebrew applications#Operating systems|Operating system]] [[Category:3DS Homebrew operating systems]]',
		['math']               = '[[List of 3DS homebrew applications#Math|Math application]] [[Category:3DS Homebrew math applications]]',
		['other']              = '[[List of 3DS homebrew applications#Other applications|Other application]] [[Category:3DS Homebrew other applications]]',
		-- Games
		['arcade game']        = '[[List of 3DS homebrew games#Arcade|Arcade game]] [[Category:3DS Homebrew arcade games]]',
		['board game']         = '[[List of 3DS homebrew games#Board|Board game]] [[Category:3DS Homebrew board games]]',
		['card game']          = '[[List of 3DS homebrew games#Card|Card game]] [[Category:3DS Homebrew card games]]',
		['game engine']        = '[[List of 3DS homebrew games#Game engine|Game engine]] [[Category:3DS Homebrew game engines]]',
		['music game']         = '[[List of 3DS homebrew games#Music|Music game]] [[Category:3DS Homebrew music games]]',
		['platform game']      = '[[List of 3DS homebrew games#Platform|Platform game]] [[Category:3DS Homebrew platform games]]',
		['puzzle game']        = '[[List of 3DS homebrew games#Puzzle|Puzzle game]] [[Category:3DS Homebrew puzzle games]]',
		['racing game']        = '[[List of 3DS homebrew games#Racing|Racing game]] [[Category:3DS Homebrew racing games]]',
		['role playing game']  = '[[List of 3DS homebrew games#Role playing|Role playing game]] [[Category:3DS Homebrew role playing games]]',
		['shooting game']      = '[[List of 3DS homebrew games#Shooter|Shooting game]] [[Category:3DS Homebrew shooting games]]',
		['simulation game']    = '[[List of 3DS homebrew games#Simulation|Simulation game]] [[Category:3DS Homebrew simulation games]]',
		['trivia game']        = '[[List of 3DS homebrew games#Trivia|Trivia game]] [[Category:3DS Homebrew trivia games]]',
		['other game']         = '[[List of 3DS homebrew games#Other games|Other game]] [[Category:3DS Homebrew other games]]',
		-- Emulators
		['console emulator']   = '[[List of 3DS homebrew emulators#Console|Console emulator]] [[Category:3DS Homebrew console emulators]]',
		['handheld emulator']  = '[[List of 3DS homebrew emulators#Handheld|Handheld emulator]] [[Category:3DS Homebrew portable emulators]]',
		['arcade emulator']    = '[[List of 3DS homebrew emulators#Arcade|Arcade emulator]] [[Category:3DS Homebrew arcade emulators]]',
		['computer emulator']  = '[[List of 3DS homebrew emulators#Computer|Computer emulator]] [[Category:3DS Homebrew computer emulators]]',
		-- Loaders
		['loader']             = '[[List of 3DS homebrew loaders|Loader]] [[Category:3DS Homebrew loaders]]',
		-- Exploits
		['exploit']            = '[[List of 3DS homebrew exploits|Exploit]] [[Category:3DS Homebrew exploits]]',
		-- System Tools
		['system tool']        = '[[List of 3DS system tools|System tool]] [[Category:3DS homebrew system tools]]',
		-- PC Utilities
		['pc utility']         = '[[List of 3DS PC utilities|PC utility]] [[Category:3DS PC utilities]]',
		-- Demos
		['demo']               = '[[List of 3DS homebrew demos|Demo]] [[Category:3DS homebrew demos]]',
	return types[type] or type .. '[[Category:Infobox homebrew using invalid type parameter]]'
local function getLicense( license )
	if empty( license ) then return end
	local licenses = {
		['Apache']       = '[ Apache License 2.0]',
		['GNU GPL']      = '[ GNU GPL]',
		['GNU LGPL']     = '[ GNU LGPL]',
		['BSD 2-Clause'] = '[ BSD 2-Clause]',
		['BSD 3-Clause'] = '[ BSD 3-Clause]',
		['Mixed']        = 'Mixed',
		['MIT']          = '[ MIT License]',
	return licenses[license] or license
local function getFormats( a )
	local formats = { '3dsx', '3ds', 'cia', 'bin', 'dat', 'cxi' }
	local ret = {}
	for i=1,#formats do
		local f = formats[i]
		local tmp = a[f]
		if not empty(tmp) then
			local label = f == 'bin' and 'bin/elf' or f
			if tmp == 'yes' then
				ret[#ret+1] = label .. ' <span style="color:#00B000">✔</span>'
			elseif tmp == 'no' then
				ret[#ret+1] = label .. ' <span style="color:red">✘</span>'
				ret[#ret+1] = label .. ' <span style="color:orange">?</span>'
	if next(ret) == nil then return end -- We got nothing...
	return table.concat(ret, '<br />')
local function getLink( label, link, altlink )
	if empty( link ) then return altlink end
	if link:find( '://' ) then
		return '[' .. link .. ' ' .. label .. ']'	
	return '[[' .. link .. '|' .. label .. ']]'
local function getSource( source )
	if empty( source ) then return end
	if source == 'included' then return 'Source included[[Category:Open source homebrew]]' end
	return getLink( 'Source', source ) .. '[[Category:Open source homebrew]]'
local function getDownloadMii( dm, dmversion, version )
	if not dm or dm ~= 'yes' then return end
	if empty(dmversion) or dmversion == version then
		return 'Downloadable via [[DownloadMii]] [[Category:3DS Homebrew in DownloadMii]]'
		return "Version '''" .. dmversion .. "''' downloadable via [[DownloadMii]] [[Category:3DS Homebrew in DownloadMii]]"
function p.main( frame )
	local a = frame:getParent().args
	local infobox = require( 'Module:Infobox' )
	if not empty( a.title ) then
		frame:callParserFunction( 'DISPLAYTITLE', a.title )	
	local ibData = {
		title    = a.title,
		image    = a.image,
		imagesize    = a.imagesize or '48px',
		imagecaption = a.imagecaption,
		header1  = 'General',
		label2   = 'Author',
		data2    =,
		label3   = 'Last Updated',
		data3    = a.lastupdated,
		label4   = 'Contributor',
		data4    = userList( a.contributor ),
		label5   = 'Ported by',
		data5    = userList( a.portedby ),
		label6   = 'Type',
		data6    = getType( a['type'] ),
		label7   = 'Version',
		data7    = a.version,
		label8   = 'License',
		data8    = getLicense( a.license ),
		label9   = 'Language',
		data9    = a.language,
		label10  = 'Format',
		data10   = getFormats( a ),
		-- Links
		data15   = getLink( 'Download',, a.downloadraw ),
		data16   = getLink( 'Website', ),
		data17   = getSource( a.source ),
		data18   = getLink( 'Discussion', a.discussion ),
		data19   = getDownloadMii(, a.dmversion, a.version ),
		below    = a.below
	if ibData.data15 or ibData.data16 or ibData.data17 or ibData.data18 or ibData.data19 then ibData.header14 = 'Links' end
	if a.cia == 'yes' then
		ibData.header11 = 'CIA information'
		ibData.label12  = 'Title ID'
		ibData.data12   = a.titleID or 'Unknown[[Category:3DS Homebrew missing CIA titleID]]'
		ibData.label13  = 'Unique ID'
		ibData.data13   = a.uniqueID or 'Unknown[[Category:3DS Homebrew missing CIA uniqueID]]'
	return infobox.infobox( ibData )
return p