Module:Credits: Difference between revisions

From Eli's Software Encyclopedia
mNo edit summary
mNo edit summary
 
(12 intermediate revisions by the same user not shown)
Line 25: Line 25:
for _, credit in ipairs{Credit1, Credit2, Credit3, Credit4} do
for _, credit in ipairs{Credit1, Credit2, Credit3, Credit4} do
     if credit ~= '' then
     if credit ~= '' then
    credit = string.format('[[%s]]', credit)
        table.insert(CreditTable, credit)
        table.insert(CreditTable, credit)
     end
     end
Line 37: Line 38:
for _, graphics in ipairs{Graphics1, Graphics2, Graphics3, Graphics4, Graphics5} do
for _, graphics in ipairs{Graphics1, Graphics2, Graphics3, Graphics4, Graphics5} do
    if graphics ~= '' then
    if graphics ~= '' then
    graphics = string.format('[[%s]]', graphics)
         table.insert(GraphicsTable, graphics)
         table.insert(GraphicsTable, graphics)
     end
     end
Line 72: Line 74:
local Cast = args['Cast'] or '' -- '''Cast'''
local Cast = args['Cast'] or '' -- '''Cast'''
local Manual = args['Manual'] or '' -- '''Manual'''
local Manual = args['Manual'] or '' -- '''Manual'''
local ContentPub = args['ContentPub'] or '' -- '''Publisher'''
local ContentPub = args['ContentPub'] or '' -- '''Publisher name'''
local SrEditor = args['SrEditor'] or '' -- '''Senior Editor'''
local SrEditor = args['SrEditor'] or '' -- '''Senior Editor'''
local Editor = args['Editor'] or '' -- '''Editor'''
local Editor = args['Editor'] or '' -- '''Editor'''
Line 81: Line 83:
     local data = {
     local data = {
     'Has Title=' .. title,
     'Has Title=' .. title,
     'Concept=' .. Concept,
     'Concept=' .. utils.unwrapList(utils.unwrapLink(Concept)),
     'Designer=' .. Designer,
     'Designer=' .. utils.unwrapList(utils.unwrapLink(Designer)),
     '+sep=,',
     '+sep=;',
    'Game Idea=' .. GameIdea,
    'Game Idea=' .. utils.unwrapList(utils.unwrapLink(GameIdea)),
    '+sep=,',
    '+sep=;',
     'Additional Design=' .. ADesign,
     'Additional Design=' .. utils.unwrapList(utils.unwrapLink(ADesign)),
     '+sep=,',
     '+sep=;',
     'Producer=' .. Producer,
     'Producer=' .. utils.unwrapList(utils.unwrapLink(Producer)),
     '+sep=,',
     '+sep=;',
     'Writer=' .. Writer,
     'Writer=' .. utils.unwrapList(utils.unwrapLink(Writer)),
     '+sep=,',
     '+sep=;',
     'Art Director=' .. ArtDirector,
     'Art Director=' .. utils.unwrapList(utils.unwrapLink(ArtDirector)),
     '+sep=,',
     '+sep=;',
     'Technical Director=' .. TechDirector,
     'Technical Director=' .. utils.unwrapList(utils.unwrapLink(TechDirector)),
     '+sep=,',
     '+sep=;',
     'Assistant Producer=' .. AProducer,
     'Assistant Producer=' .. utils.unwrapList(utils.unwrapLink(AProducer)),
     '+sep=,',
     '+sep=;',
     'Lead Programmer=' .. LProgrammer,
     'Lead Programmer=' .. utils.unwrapList(utils.unwrapLink(LProgrammer)),
     '+sep=,',
     '+sep=;',
     'Senior Programmer=' .. SProgrammer,
     'Senior Programmer=' .. utils.unwrapList(utils.unwrapLink(SProgrammer)),
     '+sep=,',
     '+sep=;',
     'Programmer=' .. Programmer,
     'Programmer=' .. utils.unwrapList(utils.unwrapLink(Programmer)),
     '+sep=,',
     '+sep=;',
     'Game Programming=' .. GProgrammer,
     'Game Programming=' .. utils.unwrapList(utils.unwrapLink(GProgrammer)),
     '+sep=,',
     '+sep=;',
     'Additional Programming=' .. AProgrammer,
     'Additional Programming=' .. utils.unwrapList(utils.unwrapLink(AProgrammer)),
     '+sep=,',
     '+sep=;',
     'Lead Animator=' .. LAnimator,
     'Lead Animator=' .. utils.unwrapList(utils.unwrapLink(LAnimator)),
     '+sep=,',
     '+sep=;',
     'Animation=' .. Animation,
     'Animation=' .. utils.unwrapList(utils.unwrapLink(Animation)),
     '+sep=,',
     '+sep=;',
     'Lead Artist=' .. LArtist,
     'Lead Artist=' .. utils.unwrapList(utils.unwrapLink(LArtist)),
     '+sep=,',
     '+sep=;',
     'Art Team=' .. Artists,
     'Art Team=' .. utils.unwrapList(utils.unwrapLink(Artists)),
     '+sep=,',
     '+sep=;',
     'Concept Artist=' .. CArtist,
     'Concept Artist=' .. utils.unwrapList(utils.unwrapLink(CArtist)),
     '+sep=,',
     '+sep=;',
     'Additional Artwork=' .. AArtwork,
     'Additional Artwork=' .. utils.unwrapList(utils.unwrapLink(AArtwork)),
     '+sep=,',
     '+sep=;',
     'Technology Lead=' .. TechLead,
     'Technology Lead=' .. utils.unwrapList(utils.unwrapLink(TechLead)),
     '+sep=,',
     '+sep=;',
     'Technology Programming=' .. TProgramming,
     'Technology Programming=' .. utils.unwrapList(utils.unwrapLink(TProgramming)),
     '+sep=,',
     '+sep=;',
     'Additional Technology Programming=' .. ATProgramming,
     'Additional Technology Programming=' .. utils.unwrapList(utils.unwrapLink(ATProgramming)),
     '+sep=,',
     '+sep=;',
     'QA Lead=' .. QALead,
     'QA Lead=' .. utils.unwrapList(utils.unwrapLink(QALead)),
     '+sep=,',
     '+sep=;',
     'QA=' .. QA,
     'QA=' .. utils.unwrapList(utils.unwrapLink(QA)),
     '+sep=,',
     '+sep=;',
     'Music=' .. Music,
     'Music=' .. utils.unwrapList(utils.unwrapLink(Music)),
     '+sep=,',
     '+sep=;',
     'Sound Effects=' .. Sound,
     'Sound Effects=' .. utils.unwrapList(utils.unwrapLink(Sound)),
     '+sep=,',
     '+sep=;',
     'Audio Editor=' .. AudioEdit,
     'Audio Editor=' .. utils.unwrapList(utils.unwrapLink(AudioEdit)),
     '+sep=,',
     '+sep=;',
     'Casting Director=' .. CDirector,
     'Casting Director=' .. utils.unwrapList(utils.unwrapLink(CDirector)),
     '+sep=,',
     '+sep=;',
     'Live Action Producer=' .. LAProducer,
     'Live Action Producer=' .. utils.unwrapList(utils.unwrapLink(LAProducer)),
     '+sep=,',
     '+sep=;',
     'Director of Photography=' .. DPhoto,
     'Director of Photography=' .. utils.unwrapList(utils.unwrapLink(DPhoto)),
     '+sep=,',
     '+sep=;',
     'Video Editor=' .. VEditor,
     'Video Editor=' .. utils.unwrapList(utils.unwrapLink(VEditor)),
     '+sep=,',
     '+sep=;',
     'Cast=' .. Cast,
     'Cast=' .. utils.unwrapList(utils.unwrapLink(Cast)),
     '+sep=,',
     '+sep=;',
     'Manual=' .. Manual,
     'Manual=' .. utils.unwrapList(utils.unwrapLink(Manual)),
     '+sep=,',
     '+sep=;',
     'Publisher=' .. ContentPub,
     'Publisher name=' .. utils.unwrapList(utils.unwrapLink(ContentPub)),
     '+sep=,',
     '+sep=;',
     'Senior Editor=' .. SrEditor,
     'Senior Editor=' .. utils.unwrapList(utils.unwrapLink(SrEditor)),
     '+sep=,',
     '+sep=;',
     'Editor=' .. Editor,
     'Editor=' .. utils.unwrapList(utils.unwrapLink(Editor)),
     '+sep=,',
     '+sep=;',
     'Cover Art=' .. CoverArt,
     'Cover Art=' .. utils.unwrapList(utils.unwrapLink(CoverArt)),
     '+sep=,',
     '+sep=;',
     'Production=' .. Production
     'Production=' .. utils.unwrapList(utils.unwrapLink(Production)),
     '+sep=,',
     '+sep=;',
     'Credit=' .. table.concat(CreditTable, ','),
     'Credit=' .. table.concat(CreditTable, ','),
     '+sep=,',
     '+sep=;',
     'Graphics=' .. table.concat(GraphicsTable, ','),
     'Graphics=' .. table.concat(GraphicsTable, ','),
     '+sep=,'
     '+sep=;'
}
}
mw.smw.set( data )
mw.smw.set( data )
-- Infobox variables
-- Infobox variables
local infoboxClass = 'chameleon-infobox smwtable-clean d-table w-100 w-md-30 d-md-flex float-none float-md-right border shadow-sm ml-md-4 mb-4 text-left'
local infoboxClass = 'smwtable-clean w-100 border shadow-sm mb-4 text-left'
local pad = ''
local pad = ''
if collapsible == 'yes' then
if collapsible == 'yes' then
Line 187: Line 189:
infobox:node(headerTr)
infobox:node(headerTr)
-- Image and caption
if image ~= '' then
local imgTr = mw.html.create('tr')
    imgTr:tag('td'):attr('colspan', '2'):addClass('text-center px-0')
:wikitext(string.format('[[File:%s|class=img-fluid|%s]]',
imageFilename, imageCaption
))
    infobox:node(imgTr)
if imageCaption ~= '' then
local capTr = mw.html.create('tr')
capTr:tag('td'):attr('colspan', '2'):addClass('text-center px-0')
:wikitext(imageCaption)
infobox:node(capTr)
    end
end
-- Print data rows
-- Print data rows
local function appendIfExists(label, value)
local function appendIfExists(label, value, link, splitsep)
     local tr = utils.addLabelValue(label, value)
     local tr = utils.addLabelValue(label, value, link, splitsep)
     if tr then infobox:node(tr) end
     if tr then infobox:node(tr) end
end
end
appendIfExists('Title', title)
appendIfExists('Concept',             Concept, 'link', ';')
appendIfExists('Concept=',             Concept)
appendIfExists('Designer',           Designer, 'link', ';')
appendIfExists('Designer=',             Designer)
appendIfExists('Credit', table.concat(CreditTable, ', '))
appendIfExists('Credit=', table.concat(CreditTable, ', '))
     appendIfExists('Graphics', table.concat(GraphicsTable, ', '))
     appendIfExists('Graphics=', table.concat(GraphicsTable, ', '))
appendIfExists('Game Idea',          GameIdea, 'link', ';')
appendIfExists('Game Idea=',          GameIdea)
appendIfExists('Additional Design',  ADesign, 'link', ';')
appendIfExists('Additional Design=',  ADesign)
appendIfExists('Producer',            Producer, 'link', ';')
appendIfExists('Producer=',            Producer)
appendIfExists('Writer',              Writer, 'link', ';')
appendIfExists('Writer=',              Writer)
appendIfExists('Art Director',        ArtDirector, 'link', ';')
appendIfExists('Art Director=',        ArtDirector)
appendIfExists('Technical Director',  TechDirector, 'link', ';')
appendIfExists('Technical Director=',  TechDirector)
appendIfExists('Assistant Producer',  AProducer, 'link', ';')
appendIfExists('Assistant Producer=',  AProducer)
appendIfExists('Lead Programmer',    LProgrammer, 'link', ';')
appendIfExists('Lead Programmer=',    LProgrammer)
appendIfExists('Senior Programmer',  SProgrammer, 'link', ';')
appendIfExists('Senior Programmer=',  SProgrammer)
appendIfExists('Programmer',          Programmer, 'link', ';')
appendIfExists('Programmer=',          Programmer)
appendIfExists('Game Programming',    GProgrammer, 'link', ';')
appendIfExists('Game Programming=',    GProgrammer)
appendIfExists('Additional Programming', AProgrammer, 'link', ';')
appendIfExists('Additional Programming=', AProgrammer)
appendIfExists('Lead Animator',      LAnimator, 'link', ';')
appendIfExists('Lead Animator=',      LAnimator)
appendIfExists('Animation',          Animation, 'link', ';')
appendIfExists('Animation=',          Animation)
appendIfExists('Lead Artist',        LArtist, 'link', ';')
appendIfExists('Lead Artist=',        LArtist)
appendIfExists('Art Team',            Artists, 'link', ';')
appendIfExists('Art Team=',            Artists)
appendIfExists('Concept Artist',      CArtist, 'link', ';')
appendIfExists('Concept Artist=',      CArtist)
appendIfExists('Additional Artwork',  AArtwork, 'link', ';')
appendIfExists('Additional Artwork=',  AArtwork)
appendIfExists('Technology Lead',    TechLead, 'link', ';')
appendIfExists('Technology Lead=',    TechLead)
appendIfExists('Technology Programming', TProgramming, 'link', ';')
appendIfExists('Technology Programming=', TProgramming)
appendIfExists('Additional Technology Programming', ATProgramming, 'link', ';')
appendIfExists('Additional Technology Programming=', ATProgramming)
appendIfExists('QA Lead',            QALead, 'link', ';')
appendIfExists('QA Lead=',            QALead)
appendIfExists('QA',                  QA, 'link', ';')
appendIfExists('QA=',                  QA)
appendIfExists('Music',              Music, 'link', ';')
appendIfExists('Music=',              Music)
appendIfExists('Sound Effects',      Sound, 'link', ';')
appendIfExists('Sound Effects=',      Sound)
appendIfExists('Audio Editor',        AudioEdit, 'link', ';')
appendIfExists('Audio Editor=',        AudioEdit)
appendIfExists('Casting Director',    CDirector, 'link', ';')
appendIfExists('Casting Director=',    CDirector)
appendIfExists('Live Action Producer', LAProducer, 'link', ';')
appendIfExists('Live Action Producer=', LAProducer)
appendIfExists('Director of Photography', DPhoto, 'link', ';')
appendIfExists('Director of Photography=', DPhoto)
appendIfExists('Video Editor',        VEditor, 'link', ';')
appendIfExists('Video Editor=',        VEditor)
appendIfExists('Cast',                Cast, 'link', ';')
appendIfExists('Cast=',                Cast)
appendIfExists('Manual',              Manual, 'link', ';')
appendIfExists('Manual=',              Manual)
appendIfExists('Publisher',          ContentPub, 'catlink', ';')
appendIfExists('Publisher=',          ContentPub)
appendIfExists('Senior Editor',      SrEditor, 'link', ';')
appendIfExists('Senior Editor=',      SrEditor)
appendIfExists('Editor',              Editor, 'link', ';')
appendIfExists('Editor=',              Editor)
appendIfExists('Cover Art',          CoverArt, 'link', ';')
appendIfExists('Cover Art=',          CoverArt)
appendIfExists('Production',          Production, 'link', ';')
appendIfExists('Production=',          Production)
return html
return html

Latest revision as of 12:34, December 16, 2025

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

local utils = require('Module:Utils')

local p = {}

function p.semanticStore(frame)

	local titleObj    = mw.title.getCurrentTitle()
	local args        = frame:getParent().args or {}
	
	-- Get infobox helper params
	local collapsible = args['collapsible'] or 'no'
	local state       = args['state'] or 'autocollapse'

	-- Get other properties	
	local title       = args['title'] or titleObj.text 
	
	local Concept = args['Concept'] or ''
	local Designer = args['Designer'] or ''
	-- Credit
	local Credit1 = args['Credit1'] or ''
	local Credit2 = args['Credit2'] or ''
	local Credit3 = args['Credit3'] or ''
	local Credit4 = args['Credit4'] or ''
	local CreditTable = {}
	for _, credit in ipairs{Credit1, Credit2, Credit3, Credit4} do
    	if credit ~= '' then
    		credit = string.format('[[%s]]', credit)
	        table.insert(CreditTable, credit)
    	end
	end
	-- Graphics
	local Graphics1 = args['Graphics1'] or ''
	local Graphics2 = args['Graphics2'] or ''
	local Graphics3 = args['Graphics3'] or ''
	local Graphics4 = args['Graphics4'] or ''
	local Graphics5 = args['Graphics5'] or ''
	local GraphicsTable = {}
	for _, graphics in ipairs{Graphics1, Graphics2, Graphics3, Graphics4, Graphics5} do
	    if graphics ~= '' then
	    	graphics = string.format('[[%s]]', graphics)
    	    table.insert(GraphicsTable, graphics)
    	end
	end
	local GameIdea = args['GameIdea'] or '' -- '''Game Idea'''
	local ADesign = args['ADesign'] or '' -- '''Additional Design'''
	local Producer = args['Producer'] or '' -- '''Producer'''
	local Writer = args['Writer'] or '' -- '''Writer'''
	local ArtDirector = args['ArtDirector'] or '' -- '''Art Director'''
	local TechDirector = args['TechDirector'] or '' -- '''Technical Director'''
	local AProducer = args['AProducer'] or '' -- '''Assistant Producer'''
	local LProgrammer = args['LProgrammer'] or '' -- '''Lead Programmer'''
	local SProgrammer = args['SProgrammer'] or '' -- '''Senior Programmer'''
	local Programmer = args['Programmer'] or '' -- '''Programmer'''
	local GProgrammer = args['GProgrammer'] or '' -- '''Game Programming'''
	local AProgrammer = args['AProgrammer'] or '' -- '''Additional Programming'''
	local LAnimator = args['LAnimator'] or '' -- '''Lead Animator'''
	local Animation = args['Animation'] or '' -- '''Animation'''
	local LArtist = args['LArtist'] or '' -- '''Lead Artist'''
	local Artists = args['Artists'] or '' -- '''Art Team'''
	local CArtist = args['CArtist'] or '' -- '''Concept Artist'''
	local AArtwork = args['AArtwork'] or '' -- '''Additional Artwork'''
	local TechLead = args['TechLead'] or '' -- '''Technology Lead'''
	local TProgramming = args['TechLead'] or '' -- '''Technology Programming'''
	local ATProgramming = args['ATProgramming'] or '' -- '''Additional Technology Programming'''
	local QALead = args['QALead'] or '' -- '''QA Lead'''
	local QA = args['QA'] or '' -- '''QA'''
	local Music = args['Music'] or '' -- '''Music'''
	local Sound = args['Sound'] or '' -- '''Sound Effects'''
	local AudioEdit = args['AudioEdit'] or '' -- '''Audio Editor'''
	local CDirector = args['CDirector'] or '' -- '''Casting Director'''
	local LAProducer = args['LAProducer'] or '' -- '''Live Action Producer'''
	local DPhoto = args['DPhoto'] or '' -- '''Director of Photography'''
	local VEditor = args['VEditor'] or '' -- '''Video Editor'''
	local Cast = args['Cast'] or '' -- '''Cast'''
	local Manual = args['Manual'] or '' -- '''Manual'''
	local ContentPub = args['ContentPub'] or '' -- '''Publisher name'''
	local SrEditor = args['SrEditor'] or '' -- '''Senior Editor'''
	local Editor = args['Editor'] or '' -- '''Editor'''
	local CoverArt = args['CoverArt'] or '' -- '''Cover Art'''
	local Production = args['Production'] or '' -- '''Production'''
		
	-- Set properties
    local data = {
    	'Has Title=' .. title,
    	'Concept=' .. utils.unwrapList(utils.unwrapLink(Concept)),
    	'Designer=' .. utils.unwrapList(utils.unwrapLink(Designer)),
    	'+sep=;',
	    'Game Idea=' .. utils.unwrapList(utils.unwrapLink(GameIdea)),
	    '+sep=;',
    	'Additional Design=' .. utils.unwrapList(utils.unwrapLink(ADesign)),
    	'+sep=;',
    	'Producer=' .. utils.unwrapList(utils.unwrapLink(Producer)),
    	'+sep=;',
    	'Writer=' .. utils.unwrapList(utils.unwrapLink(Writer)),
    	'+sep=;',
    	'Art Director=' .. utils.unwrapList(utils.unwrapLink(ArtDirector)),
    	'+sep=;',
    	'Technical Director=' .. utils.unwrapList(utils.unwrapLink(TechDirector)),
    	'+sep=;',
    	'Assistant Producer=' .. utils.unwrapList(utils.unwrapLink(AProducer)),
    	'+sep=;',
    	'Lead Programmer=' .. utils.unwrapList(utils.unwrapLink(LProgrammer)),
    	'+sep=;',
    	'Senior Programmer=' .. utils.unwrapList(utils.unwrapLink(SProgrammer)),
    	'+sep=;',
    	'Programmer=' .. utils.unwrapList(utils.unwrapLink(Programmer)),
    	'+sep=;',
    	'Game Programming=' .. utils.unwrapList(utils.unwrapLink(GProgrammer)),
    	'+sep=;',
    	'Additional Programming=' .. utils.unwrapList(utils.unwrapLink(AProgrammer)),
    	'+sep=;',
    	'Lead Animator=' .. utils.unwrapList(utils.unwrapLink(LAnimator)),
    	'+sep=;',
    	'Animation=' .. utils.unwrapList(utils.unwrapLink(Animation)),
    	'+sep=;',
    	'Lead Artist=' .. utils.unwrapList(utils.unwrapLink(LArtist)),
    	'+sep=;',
    	'Art Team=' .. utils.unwrapList(utils.unwrapLink(Artists)),
    	'+sep=;',
    	'Concept Artist=' .. utils.unwrapList(utils.unwrapLink(CArtist)),
    	'+sep=;',
    	'Additional Artwork=' .. utils.unwrapList(utils.unwrapLink(AArtwork)),
    	'+sep=;',
    	'Technology Lead=' .. utils.unwrapList(utils.unwrapLink(TechLead)),
    	'+sep=;',
    	'Technology Programming=' .. utils.unwrapList(utils.unwrapLink(TProgramming)),
    	'+sep=;',
    	'Additional Technology Programming=' .. utils.unwrapList(utils.unwrapLink(ATProgramming)),
    	'+sep=;',
    	'QA Lead=' .. utils.unwrapList(utils.unwrapLink(QALead)),
    	'+sep=;',
    	'QA=' .. utils.unwrapList(utils.unwrapLink(QA)),
    	'+sep=;',
    	'Music=' .. utils.unwrapList(utils.unwrapLink(Music)),
    	'+sep=;',
    	'Sound Effects=' .. utils.unwrapList(utils.unwrapLink(Sound)),
    	'+sep=;',
    	'Audio Editor=' .. utils.unwrapList(utils.unwrapLink(AudioEdit)),
    	'+sep=;',
    	'Casting Director=' .. utils.unwrapList(utils.unwrapLink(CDirector)),
    	'+sep=;',
    	'Live Action Producer=' .. utils.unwrapList(utils.unwrapLink(LAProducer)),
    	'+sep=;',
    	'Director of Photography=' .. utils.unwrapList(utils.unwrapLink(DPhoto)),
    	'+sep=;',
    	'Video Editor=' .. utils.unwrapList(utils.unwrapLink(VEditor)),
    	'+sep=;',
    	'Cast=' .. utils.unwrapList(utils.unwrapLink(Cast)),
    	'+sep=;',
    	'Manual=' .. utils.unwrapList(utils.unwrapLink(Manual)),
    	'+sep=;',
    	'Publisher name=' .. utils.unwrapList(utils.unwrapLink(ContentPub)),
    	'+sep=;',
    	'Senior Editor=' .. utils.unwrapList(utils.unwrapLink(SrEditor)),
    	'+sep=;',
    	'Editor=' .. utils.unwrapList(utils.unwrapLink(Editor)),
    	'+sep=;',
    	'Cover Art=' .. utils.unwrapList(utils.unwrapLink(CoverArt)),
    	'+sep=;',
    	'Production=' .. utils.unwrapList(utils.unwrapLink(Production)),
    	'+sep=;',
    	'Credit=' .. table.concat(CreditTable, ','),
    	'+sep=;',
    	'Graphics=' .. table.concat(GraphicsTable, ','),
    	'+sep=;'
	}
	mw.smw.set( data )
	
	-- Infobox variables
	local infoboxClass = 'smwtable-clean w-100 border shadow-sm mb-4 text-left'
	local pad = ''
	if collapsible == 'yes' then
		infoboxClass = infoboxClass .. ' collapsible ' .. state
		pad = frame:preprocess('{{pad|5em}}')
	end
	-- Build infobox
	local html   = mw.html.create()
	local infobox = html:tag('table'):addClass(infoboxClass)
    	:css('font-size', '90%')
		:attr('cellpadding', '0')
		:attr('cellspacing', '0')
		
	-- Header row (title + optional image)
	local headerTr = mw.html.create('tr')
	headerTr:tag('td'):attr('colspan', '2')
       	:tag('div'):addClass('summary text-center font-italic font-weight-bold')
			:css('font-size', '110%')
			:wikitext(pad .. title):done()
		infobox:node(headerTr)
		
	-- Print data rows
	local function appendIfExists(label, value, link, splitsep)
    	local tr = utils.addLabelValue(label, value, link, splitsep)
    	if tr then infobox:node(tr) end
	end
	
	appendIfExists('Concept',             Concept, 'link', ';')
	appendIfExists('Designer',            Designer, 'link', ';')
	appendIfExists('Credit', table.concat(CreditTable, ', '))
    appendIfExists('Graphics', table.concat(GraphicsTable, ', '))
	appendIfExists('Game Idea',           GameIdea, 'link', ';')
	appendIfExists('Additional Design',   ADesign, 'link', ';')
	appendIfExists('Producer',            Producer, 'link', ';')
	appendIfExists('Writer',              Writer, 'link', ';')
	appendIfExists('Art Director',        ArtDirector, 'link', ';')
	appendIfExists('Technical Director',  TechDirector, 'link', ';')
	appendIfExists('Assistant Producer',  AProducer, 'link', ';')
	appendIfExists('Lead Programmer',     LProgrammer, 'link', ';')
	appendIfExists('Senior Programmer',   SProgrammer, 'link', ';')
	appendIfExists('Programmer',          Programmer, 'link', ';')
	appendIfExists('Game Programming',    GProgrammer, 'link', ';')
	appendIfExists('Additional Programming', AProgrammer, 'link', ';')
	appendIfExists('Lead Animator',       LAnimator, 'link', ';')
	appendIfExists('Animation',           Animation, 'link', ';')
	appendIfExists('Lead Artist',         LArtist, 'link', ';')
	appendIfExists('Art Team',            Artists, 'link', ';')
	appendIfExists('Concept Artist',      CArtist, 'link', ';')
	appendIfExists('Additional Artwork',  AArtwork, 'link', ';')
	appendIfExists('Technology Lead',     TechLead, 'link', ';')
	appendIfExists('Technology Programming', TProgramming, 'link', ';')
	appendIfExists('Additional Technology Programming', ATProgramming, 'link', ';')
	appendIfExists('QA Lead',             QALead, 'link', ';')
	appendIfExists('QA',                  QA, 'link', ';')
	appendIfExists('Music',               Music, 'link', ';')
	appendIfExists('Sound Effects',       Sound, 'link', ';')
	appendIfExists('Audio Editor',        AudioEdit, 'link', ';')
	appendIfExists('Casting Director',    CDirector, 'link', ';')
	appendIfExists('Live Action Producer', LAProducer, 'link', ';')
	appendIfExists('Director of Photography', DPhoto, 'link', ';')
	appendIfExists('Video Editor',        VEditor, 'link', ';')
	appendIfExists('Cast',                Cast, 'link', ';')
	appendIfExists('Manual',              Manual, 'link', ';')
	appendIfExists('Publisher',           ContentPub, 'catlink', ';')
	appendIfExists('Senior Editor',       SrEditor, 'link', ';')
	appendIfExists('Editor',              Editor, 'link', ';')
	appendIfExists('Cover Art',           CoverArt, 'link', ';')
	appendIfExists('Production',          Production, 'link', ';')
	
	return html
end

return p