Module:Infobox

From Caves of Qud Wiki
Jump to navigation Jump to search
Template-info.png Documentation

This module implements {{infobox}}. The module should generally be invoked directly on template pages, rather than using the infobox template.

Parent arguments are automatically merged with directly passed arguments (the latter overwriting the former) and all arguments are normalised to trim whitespace and set empty arguments to nil.

Adapted from Minecraft Wiki.

Dependencies


local p = {}
function p.infobox( f )
	local args = require( 'Module:ProcessArgs' ).merge( true )
	local titleObject = mw.title.getCurrentTitle()
	local title = args.title or titleObject.baseText
	
	local imageArea = args.imagearea
	if not imageArea and imageArea ~= 'none' then
		local images = {}
		local defaultImageSize = args.defaultimagesize or '160px'
		args.image1 = args.image1 or args.image or 'title'
		args.image1size = args.image1size or args.imagesize
		
		local imgCount = {}
		for k, v in pairs( args ) do
			if type( k ) == 'string' then
				local image, num = k:match( '^(image)(%d+)$' )
				if v:lower() ~= 'none' then
					if image then
						table.insert( imgCount, tonumber( num ) )
					end
				end
			end
		end
		
		table.sort( imgCount )
		local animate
		for k, v in ipairs( imgCount ) do
			local image = args['image' .. v]
			local size = args['image' .. v .. 'size'] or defaultImageSize
			
			if image == 'title' then
				local imageTitle = mw.title.new( 'Media:' .. title .. '.png' )
				if imageTitle and imageTitle.exists then
					image = '[[File:' .. title .. '.png|' .. size .. ']]'
				elseif titleObject.namespace == 0 then
					image = '[[File:No image.svg|' .. size .. '|link=File:' .. title .. '.png|Upload ' .. title .. '.png]]'
				else
					image = '[[File:No image.svg|' .. size .. '|link=]]'
				end
			elseif image:match( ';' ) then
				if not animate then
					animate = require( 'Module:Animate' ).animate
				end
				image = animate{ image, size }
			else
				image = '[[File:' .. image .. '|' .. size .. ']]'
			end
			
			table.insert( images, '<div>' .. image .. '</div>' )
		end
		images = table.concat( images, '\n' )
		
		if images ~= '' then
			imageArea = images .. '\n'
		else
			imageArea = 'none'
		end
	end
	if imageArea and imageArea ~= 'none' then
		imageArea = '<div class="infobox-imagearea">' .. imageArea .. '</div>'
	else
		imageArea = ''
	end
	
	local footer = args.footer
	if footer then
		footer = '| class="infobox-footer" colspan="2" | ' .. footer
	end
	
	local gameversion = args.gameversion
	if gameversion then
        local frame = mw.getCurrentFrame()
        frame:callParserFunction{ name = '#cargo_store', args = { '',
            _table = 'VersHistInfobox', Version = gameversion
        } }
		gameversion = '| class="infobox-gameversion-postfooter" colspan="2" | <div class="qud-infobox-version">Infobox data from game version <span class="qud-version-num">' .. gameversion .. '</span></div>'
    end

        local infoboxStartDiv = '<div class="moduleinfobox'
        local class = args.class
        if class then
                infoboxStartDiv = infoboxStartDiv .. ' ' .. class
        end
        infoboxStartDiv = infoboxStartDiv .. '"'

        local style = args.style
        if style then
                infoboxStartDiv = infoboxStartDiv .. ' style="' .. style .. '"'
        end
        
        infoboxStartDiv = infoboxStartDiv .. '>'
	
	local html = {
		infoboxStartDiv,
			'<div class="infobox-title">' .. title .. '</div>',
			imageArea,
			'{| class="infobox-rows" cellspacing="1" cellpadding="4"',
			'|-',
			args.rows or '',
			footer or '',
			gameversion or '',
			'|}',
		'</div>'
	}
	
	return table.concat( html, '\n' )
end

return p