Module:Game

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', "000" .. args.completion 			.. ".svg", { 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.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( '' ) 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 =  .. 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 = ' and ' .. args.series2 .. '' end addRow( { label = 'Series', data =  .. 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 =  .. args[ 'year' .. listnum ] .. , rowclass = 'mw-row-no-collapse' } ) root:wikitext( '' ) 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( '' )

if args.completion then root:wikitext( '' ) end

if not args.image then mw.html.create:wikitext( '' ) 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( '' ) end

if args.series then root:wikitext( '' ) end if args.series2 then root:wikitext( '' ) 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 = '' .. mw.title.getCurrentTitle.text .. ' at PCGamingWiki' 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( '' ) ) :wikitext( mw.getCurrentFrame:preprocess( '' ) )

renderSocialRows renderTrackingCategories

newRoot:node( root )

return tostring( newRoot ) .. ' ' end

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

return _game end

return p