Module:Infobox album

From SPCodex, The Smashing Pumpkins wiki

Documentation for this module may be created at Module:Infobox album/doc

local p = {}

local types = {
	['ep'] = {
		color = 'lightsalmon',
		link = '[[:Category:EPs|EP]]',
		category = 'EPs',
		respect_casing = true
	},
	['studio'] = {
		color = 'lightsteelblue',
		link = '[[:Category:Studio albums|Studio album]]',
		category = 'Studio albums'
	},
	['recording'] = {
		color = 'peachpuff',
		link = 'Recording',
		category = ''
	},
	['demo'] = {
		color = 'khaki',
		link = '[[:Category:Demo albums|Demo album]]',
		category = 'Demo albums'
	},
	['live'] = {
		color = 'burlywood',
		link = '[[:Category:Live albums|Live album]]',
		category = 'Live albums'
	},
	['greatest hits'] = {
		color = 'darkseagreen',
		link = '[[:Category:Compilation albums|Compilation album]]',
		category = 'Compilation albums'
	},
	['box set'] = {
		color = 'darkseagreen',
		link = '[[:Category:Box sets|Box set]]',
		category = 'Box sets'
	},
	['compilation'] = {
		color = 'darkseagreen',
		link = '[[:Category:Compilation albums|Compilation album]]',
		category = 'Compilation albums'
	},
	['remix'] = {
		color = 'peachpuff',
		link = '[[:Category:Remix album|Remix album]]',
		category = 'Category:Remix albums'
	},
	['soundtrack'] = {
		color = 'gainsboro',
		link = '[[:Category:Soundtrack albums|Soundtrack]]',
		category = 'Soundtrack albums'
	},
	['film score'] = {
		color = 'gainsboro',
		link = '[[:Category:Soundtrack albums|Soundtrack album]]',
		category = 'Soundtrack albums'
	},
	['video'] = {
		color = ' #99CCFF',
		link = '[[:Category:Video releases|Video release]]',
		category = 'Video releases'
	},
	['promo'] = {
		color = 'peachpuff',
		link = '[[:Category:Promotional releases|Promotional release]]',
		category = 'Promotional releases'
	},
	['promotional'] = {
		color = 'peachpuff',
		link = '[[:Category:Promotional releases|Promotional release]]',
		category = 'Promotional releases'
	},
	['tribute'] = {
		color = 'peachpuff',
		link = '[[:Category:Tribute albums|Tribute album]]',
		category = 'Tribute albums'
	},
	['bootleg'] = {
		color = ' #E6E8FA',
		link = '[[:Category:Bootleg albums|Bootleg]]',
		category = 'Bootleg albums'
	}
}

local artists = {
	['The Smashing Pumpkins'] = true,
	['Billy Corgan'] = true,
	['Zwan'] = true,
	['James Iha'] = true,
	['Jimmy Chamberlin Complex'] = true,
	['The Marked'] = true,
	['Various artists'] = true
}

function p.link( frame )
	local given = mw.text.split(frame.args[1], "%s*,%s*")
	return types[given[1]].link
end

function p.color( frame )
	local given = mw.text.split(frame.args[1], "%s*,%s*")
	if given[1] ~= nil and types[given[1]] ~= nil then
		return types[given[1]].color
	end
end

function p.categories( frame )
	local given = mw.text.split(frame.args[1], "%s*,%s*")
	local artist = frame.args[2]
	local is_tribute = string.find(frame.args[1], "tribute")

	if artists[artist] == nil and not(is_tribute) then
		return '[[Category:Side projects]]'
	end

	local cats = '[[Category:Albums]]'

	if not(is_tribute) then
		cats = cats .. '[[Category:' .. artist .. ' albums]]'
	end

	if artist == 'The Marked' then
		return cats
	end

	for _, v in ipairs(given) do
		local data = types[v]
		if data.category ~= '' then
			cats = cats .. '[[Category:' .. data.category .. ']]'
		end

		if artist ~= 'Various artists' and not(is_tribute) then
			if data.respect_casing then
				cats = cats .. '[[Category:' .. artist .. ' ' .. data.category .. ']]'
			else
				cats = cats .. '[[Category:' .. artist .. ' ' .. data.category:lower() .. ']]'
			end
		end
	end
	
	return cats
end

function p._studio_sessions(album)
	local cargo = mw.ext.cargo
	local results = cargo.query(
		'studio_sessions, albums',
		'studio_sessions._pageName=page',
		{
			where = 'albums.name = "' .. album .. '"',
			join = 'studio_sessions.album HOLDS albums.name',
			orderBy = 'date_from ASC',
			groupBy = 'studio_sessions._pageName'
		}
	)

	if 0 == #results or (1 == #results and results[1]['page'] == nil) then
		return ''
	elseif 1 == #results then
		return '[[' .. results[1]['page'] .. ']]'
	end

	local root = mw.html.create()
	local ulRoot = root:tag('ul')
		:addClass('studio-sessions')
	local sessions = {}
	for r = 1, #results do
		local page = results[r]['page']
		if page ~= nil and page ~= '' then
			ulRoot:tag('li')
				:wikitext('[[' .. page .. ']]')
		end
	end

	return tostring(root)
end

function p.studio_sessions(frame)
	local album = frame.args[1]
	return p._studio_sessions(album)
end

return p