From StrategyWiki, the video game walkthrough and strategy guide wiki
Jump to navigation Jump to search
(link series disambig even if the category doesn't exist yet)
(add cs cat)
Line 177: Line 177:
local function renderTrackingCategories()
local function renderTrackingCategories()
root:wikitext( '[[Category:Games]]' )
root:wikitext( '[[Category:Games]]' )
if args.completion then
root:wikitext( '[[Category:Guides at completion stage ' .. args.completion .. ']]' )
end
if not args.image then
if not args.image then
mw.html.create():wikitext( '[[Category:Pages needing box artwork]]' )
mw.html.create():wikitext( '[[Category:Pages needing box artwork]]' )

Revision as of 07:25, 22 September 2021

Documentation for this module may be created at Module:Game/Documentation

local getArgs = require('Module:Arguments').getArgs

local p = {}

local args = {}
local root
local newRoot
local gameContainer

local function getArgNums(prefix)
	-- Returns a table containing the numbers of the arguments that exist
	-- for the specified prefix. For example, if the prefix was 'data', and
	-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
	local nums = {}
	for k, v in pairs(args) do
		local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
		if num then table.insert(nums, tonumber(num)) end
	end
	table.sort(nums)
	return nums
end

local function renderCompletion()
	if args.completion then
		newRoot:wikitext(mw.getCurrentFrame():extensionTag( 
			'indicator', 
			"[[File:000" .. args.completion 
			.. ".svg|32px|This guide is at completion stage " .. args.completion 
			.. ". Click here for more information.|link=:Category:Guides at completion stage " 
			.. args.completion .. "]]", 
			{ name = 'cs' } ) )
	end
end

local function renderSeriesDisambig()
	args.seriesDisambig = args.seriesDisambig or args.title or mw.title.getCurrentTitle().text
	
	if args.seriesDisambig == args.series or args.seriesDisambig == args.series2 then
		local seriesCat = mw.title.new( args.seriesDisambig, 14 )
		newRoot
			:wikitext("''This is the first game in the '''" .. seriesCat.text .. "''' series. For other games in the series see the [[:" .. seriesCat.prefixedText .. "|" .. seriesCat.text .. " category]].''" )
	end
end

local function addRow( rowArgs )
	-- Adds a row to the infobox, with either a header cell
	-- or a label/data cell combination.
	if rowArgs.header then
		root
			:tag( 'tr' )
				:addClass( rowArgs.rowclass )
				:tag( 'th' )
					:attr( 'colspan', 2 )
					:css( 'text-align', 'center' )
					:cssText( rowArgs.headerstyle )
					:wikitext( rowArgs.header )
	else
		local row = root:tag( 'tr' ):addClass( rowArgs.rowclass )

		if rowArgs.label then
			row
				:tag( 'th' )
					:cssText( rowArgs.labelstyle )
					:wikitext( rowArgs.label )
					:done()
		end

		local dataCell = row:tag( 'td' )
		if not rowArgs.label then
			dataCell
				:attr( 'colspan', 2 )
				:cssText( rowArgs.rowstyles or 'text-align: center;' )
		end
		dataCell
			:wikitext( rowArgs.data )
	end
end

local function renderTitle()
	args.title = args.title or mw.title.getCurrentTitle().text

	root
		:tag( 'tr' )
			:tag( 'th' )
				:attr( 'colspan', 2 )
				:addClass( 'infobox_heading' )
				:wikitext( args.title )
end

local function renderImage()
	if args.image then
		gameContainer:wikitext( '[[File:' .. args.image .. '|250px|left|Box artwork for ' .. args.title .. '.]]' )
	end
end

local function renderRows()
	if args.japanese then addRow( {label = 'Japanese title', data = args.japanese} ) end
	if args.distributor then addRow( {label = 'Distributor(s)', data = args.distributor} ) end
	if args.designer then addRow( {label = 'Designer(s)', data = args.designer} ) end
	if not args.year then
		addRow( { label = 'Release date(s)', labelstyle = 'white-space: nowrap;', data = args.released } )
	end
	addRow( { label = 'Genre(s)', data = args.genre, rowclass = 'mw-row-no-collapse' } )
	if args.players then addRow( {label = 'Players', data = args.players} ) end
	if args.modes then addRow( {label = 'Modes', data = args.modes} ) end
	if args.version then addRow( {label = 'Latest version', data = args.version} ) end
	if args.ratings then addRow( { label = 'Rating(s)', data = args.ratings, rowclass = 'mw-row-no-collapse' } ) end
	if args.input then addRow( {label = 'Input', data = args.input} ) end
end

local function renderRowsCommon()
	addRow( { label = 'Developer(s)', data = args.developer } )
	addRow( { label = 'Publisher(s)', data = args.publisher } )
	if args.year then
		addRow( { label = 'Year released', data = '[[:Category:' .. args.year .. '|' .. args.year .. ']]' } )
	end
	addRow( { label = 'System(s)', data = args.systems } )
	if args.expansion then addRow( { label = 'Expansion pack(s)', labelstyle = 'white-space: nowrap;', data = args.expansion } ) end
	if args['preceded by'] then addRow( { label = 'Preceded by', labelstyle = 'white-space: nowrap;', data = "''" .. args['preceded by'] .. "''" } ) end
	if args['followed by'] then addRow( { label = 'Followed by', labelstyle = 'white-space: nowrap;', data = "''" .. args['followed by'] .. "''" } ) end
	if args.series then
		local data2 = ''
		if args.series2 then data2 = '<br>and<br>[[:Category:' .. args.series2 .. '|' .. args.series2 .. ']]' end
		addRow( { label = 'Series', data = '[[:Category:' .. args.series .. '|' .. args.series .. ']]' .. data2 } )
	end
end

local function renderRelease( listnum )
	if args[ 'title' .. listnum ] then
		root
			:tag( 'tr' )
				:tag( 'th' )
					:attr( 'colspan', 2 )
					:addClass( 'infobox_heading' )
					:wikitext( args[ 'title' .. listnum ] )
	end

	if args[ 'japanese' .. listnum ] then addRow( {label = 'Japanese title', data = args[ 'japanese' .. listnum ]} ) end
	addRow( { label = 'Developer(s)', data = args[ 'developer' .. listnum ], rowclass = 'mw-row-no-collapse' } )
	addRow( { label = 'Publisher(s)', data = args[ 'publisher' .. listnum ] } )
	addRow( { label = 'Year released', data = '[[:Category:' .. args[ 'year' .. listnum ] .. '|' .. args[ 'year' .. listnum ] .. ']]', rowclass = 'mw-row-no-collapse' } )
	root:wikitext( '[[Category:' .. args[ 'year' .. listnum ] .. ']]' )
	addRow( { label = 'System(s)', data = args[ 'systems' .. listnum ] } )
	if args[ 'version' .. listnum ] then addRow( {label = 'Latest version', data = args[ 'version' .. listnum ]} ) end
	if args[ 'ratings' .. listnum ] then addRow( { label = 'Rating(s)', data = args[ 'ratings' .. listnum ] } ) end
	if args[ 'input' .. listnum ] then addRow( {label = 'Input', data = args[ 'input' .. listnum ]} ) end
end

local function renderSocialRows()
	local twitterData, facebookData, twitchData
	local pagename = mw.uri.encode( mw.title.getCurrentTitle().text, "PATH" )

	if args.website then addRow( {label = 'Website', data = args.website} ) end
	if args.twitch then
		twitchData = '[https://www.twitch.tv/directory/game/' .. mw.uri.encode( args.twitch, "PATH" ) .. ' ' .. args.twitch .. ' Channel]'
	else
		twitchData = '[https://www.twitch.tv/directory/game/' .. pagename .. ' ' .. mw.title.getCurrentTitle().text .. ' Channel]'
	end

	if args.twitter then
		twitterData = '[https://twitter.com/' .. args.twitter .. ' ' .. args.twitter .. ']'
	else
		twitterData = '[https://twitter.com/search?f=user&q=' .. pagename .. ' Search]'
	end

	if args.facebook then
		facebookData = '[https://www.facebook.com/' .. args.facebook .. ' ' .. args.facebook .. ']'
	else
		facebookData = '[https://www.facebook.com/search/pages/?q=' .. pagename .. ' Search]'
	end

	addRow( { rowclass = 'mw-row-no-collapse', label = 'Twitch', data = twitchData } )
	addRow( { rowclass = 'mw-row-no-collapse', label = 'Twitter', data = twitterData } )
	addRow( { rowclass = 'mw-row-no-collapse', label = 'Facebook', data = facebookData } )
end

local function renderTrackingCategories()
	root:wikitext( '[[Category:Games]]' )

	if args.completion then
		root:wikitext( '[[Category:Guides at completion stage ' .. args.completion .. ']]' )
	end

	if not args.image then
		mw.html.create():wikitext( '[[Category:Pages needing box artwork]]' )
	end

	if not args.developer or not args.publisher or not args.genre or not args.systems or (not args.released and not args.year) then
		root:wikitext( '[[Category:Pages needing an infobox]]' )
	end

	if args.series then
		root:wikitext( '[[Category:' .. args.series .. ']]' )
	end
	if args.series2 then
		root:wikitext( '[[Category:' .. args.series2 .. ']]' )
	end
end

local function _game()
	newRoot = mw.html.create()
	renderCompletion()
	renderSeriesDisambig()
	gameContainer = newRoot:tag( 'div' )
	gameContainer
		:addClass( 'game-infobox-container' )

	renderImage()

	root = gameContainer:tag( 'table' )
	root
		:addClass( 'infobox' )
		:addClass( 'bordered' )

	renderTitle()
	renderRowsCommon()

	root = mw.html.create( 'table' )
	root
		:addClass( 'infobox' )
		:addClass( 'bordered' )

	renderRows()
	newRoot:node( root )

	local releasenums = getArgNums( 'title' )
	for k, num in ipairs( releasenums ) do
		root = mw.html.create( 'table' )

		root
			:addClass( 'infobox' )
			:addClass( 'bordered' )
			:addClass( 'mw-collapsible' )
			:addClass( 'mw-collapsed' )
			:css( 'margin-top', '-0.5em' )

		renderRelease( num )
		newRoot:node( root )
	end

	root = mw.html.create( 'table' )

	root
		:addClass( 'infobox' )
		:addClass( 'bordered' )
		:css( 'margin-top', '-0.5em' )
		:css( 'clear', 'right' )

	if args.pcgamingwiki then
		local data1 = '<ul><li>[[pcgamingwiki:' .. args.pcgamingwiki .. '|' .. mw.title.getCurrentTitle().text .. ' at PCGamingWiki]]</li></ul>'
		addRow( { header = 'PCGamingWiki', headerstyle = 'background-color: #c8c8c8;', rowclass = 'mw-row-no-collapse' } )
		addRow( { data = data1, rowclass = 'mw-row-no-collapse', rowstyles = 'text-align: left;' } )
	end

	root
		:wikitext( mw.getCurrentFrame():preprocess( '<NeoLink />' ) )
		:wikitext( mw.getCurrentFrame():preprocess( '<SwitcherLink />' ) )

	renderSocialRows()
	renderTrackingCategories()

	newRoot:node( root )

	return tostring( newRoot ) .. '<div style="clear: left;"></div>'
end

function p.game( frame )
	args = getArgs( frame, { wrappers = 'Template:Game' } )

	return _game()
end

return p