Module:Credits: Difference between revisions

From Eli's Software Encyclopedia
Created page with "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' local showImage = args['show image'] or 'no' -- Get other properties local title = args['title'] or titleObj.text local Concept = args['Conc..."
 
mNo edit summary
 
(10 intermediate revisions by the same user not shown)
Line 11: Line 11:
local collapsible = args['collapsible'] or 'no'
local collapsible = args['collapsible'] or 'no'
local state      = args['state'] or 'autocollapse'
local state      = args['state'] or 'autocollapse'
local showImage  = args['show image'] or 'no'


-- Get other properties
-- Get other properties
Line 73: Line 72:
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 79: Line 78:
local Production = args['Production'] or '' -- '''Production'''
local Production = args['Production'] or '' -- '''Production'''
local imageFilename, imageAlt, imageCaption = '', '', ''
if image ~= '' then
local fn, alt = utils.parseFileLink(image)
if fn then
    imageFilename = fn
        imageAlt  = alt or imageCaption or ''
        else
        imageFilename = frame:preprocess('{{PAGENAME:' .. image .. '}}')
    end
end
-- Set properties
-- Set properties
     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=,'
  'Has Image=' .. imageFilename,
    'Has Image Caption=' .. imageCaption
}
}
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 201: Line 187:
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)
     local tr = utils.addLabelValue(label, value)
     local tr = utils.addLabelValue(label, value, link)
     if tr then infobox:node(tr) end
     if tr then infobox:node(tr) end
end
end
appendIfExists('Title', title)
appendIfExists('Concept',             Concept)
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)
appendIfExists('Game Idea=',          GameIdea)
appendIfExists('Additional Design',  ADesign)
appendIfExists('Additional Design=',  ADesign)
appendIfExists('Producer',            Producer)
appendIfExists('Producer=',            Producer)
appendIfExists('Writer',              Writer)
appendIfExists('Writer=',              Writer)
appendIfExists('Art Director',        ArtDirector)
appendIfExists('Art Director=',        ArtDirector)
appendIfExists('Technical Director',  TechDirector)
appendIfExists('Technical Director=',  TechDirector)
appendIfExists('Assistant Producer',  AProducer)
appendIfExists('Assistant Producer=',  AProducer)
appendIfExists('Lead Programmer',    LProgrammer)
appendIfExists('Lead Programmer=',    LProgrammer)
appendIfExists('Senior Programmer',  SProgrammer)
appendIfExists('Senior Programmer=',  SProgrammer)
appendIfExists('Programmer',          Programmer)
appendIfExists('Programmer=',          Programmer)
appendIfExists('Game Programming',    GProgrammer)
appendIfExists('Game Programming=',    GProgrammer)
appendIfExists('Additional Programming', AProgrammer)
appendIfExists('Additional Programming=', AProgrammer)
appendIfExists('Lead Animator',      LAnimator)
appendIfExists('Lead Animator=',      LAnimator)
appendIfExists('Animation',          Animation)
appendIfExists('Animation=',          Animation)
appendIfExists('Lead Artist',        LArtist)
appendIfExists('Lead Artist=',        LArtist)
appendIfExists('Art Team',            Artists)
appendIfExists('Art Team=',            Artists)
appendIfExists('Concept Artist',      CArtist)
appendIfExists('Concept Artist=',      CArtist)
appendIfExists('Additional Artwork',  AArtwork)
appendIfExists('Additional Artwork=',  AArtwork)
appendIfExists('Technology Lead',    TechLead)
appendIfExists('Technology Lead=',    TechLead)
appendIfExists('Technology Programming', TProgramming)
appendIfExists('Technology Programming=', TProgramming)
appendIfExists('Additional Technology Programming', ATProgramming)
appendIfExists('Additional Technology Programming=', ATProgramming)
appendIfExists('QA Lead',            QALead)
appendIfExists('QA Lead=',            QALead)
appendIfExists('QA',                  QA)
appendIfExists('QA=',                  QA)
appendIfExists('Music',              Music)
appendIfExists('Music=',              Music)
appendIfExists('Sound Effects',      Sound)
appendIfExists('Sound Effects=',      Sound)
appendIfExists('Audio Editor',        AudioEdit)
appendIfExists('Audio Editor=',        AudioEdit)
appendIfExists('Casting Director',    CDirector)
appendIfExists('Casting Director=',    CDirector)
appendIfExists('Live Action Producer', LAProducer)
appendIfExists('Live Action Producer=', LAProducer)
appendIfExists('Director of Photography', DPhoto)
appendIfExists('Director of Photography=', DPhoto)
appendIfExists('Video Editor',        VEditor)
appendIfExists('Video Editor=',        VEditor)
appendIfExists('Cast',                Cast)
appendIfExists('Cast=',                Cast)
appendIfExists('Manual',              Manual)
appendIfExists('Manual=',              Manual)
appendIfExists('Publisher',          ContentPub)
appendIfExists('Publisher=',          ContentPub)
appendIfExists('Senior Editor',      SrEditor)
appendIfExists('Senior Editor=',      SrEditor)
appendIfExists('Editor',              Editor)
appendIfExists('Editor=',              Editor)
appendIfExists('Cover Art',          CoverArt)
appendIfExists('Cover Art=',          CoverArt)
appendIfExists('Production',          Production)
appendIfExists('Production=',          Production)
return html
return html

Latest revision as of 20:53, December 10, 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
	        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
    	    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)
    	local tr = utils.addLabelValue(label, value, link)
    	if tr then infobox:node(tr) end
	end
	
	appendIfExists('Concept',             Concept)
	appendIfExists('Designer',            Designer, 'link')
	appendIfExists('Credit', table.concat(CreditTable, ', '))
    appendIfExists('Graphics', table.concat(GraphicsTable, ', '))
	appendIfExists('Game Idea',           GameIdea)
	appendIfExists('Additional Design',   ADesign)
	appendIfExists('Producer',            Producer)
	appendIfExists('Writer',              Writer)
	appendIfExists('Art Director',        ArtDirector)
	appendIfExists('Technical Director',  TechDirector)
	appendIfExists('Assistant Producer',  AProducer)
	appendIfExists('Lead Programmer',     LProgrammer)
	appendIfExists('Senior Programmer',   SProgrammer)
	appendIfExists('Programmer',          Programmer)
	appendIfExists('Game Programming',    GProgrammer)
	appendIfExists('Additional Programming', AProgrammer)
	appendIfExists('Lead Animator',       LAnimator)
	appendIfExists('Animation',           Animation)
	appendIfExists('Lead Artist',         LArtist)
	appendIfExists('Art Team',            Artists)
	appendIfExists('Concept Artist',      CArtist)
	appendIfExists('Additional Artwork',  AArtwork)
	appendIfExists('Technology Lead',     TechLead)
	appendIfExists('Technology Programming', TProgramming)
	appendIfExists('Additional Technology Programming', ATProgramming)
	appendIfExists('QA Lead',             QALead)
	appendIfExists('QA',                  QA)
	appendIfExists('Music',               Music)
	appendIfExists('Sound Effects',       Sound)
	appendIfExists('Audio Editor',        AudioEdit)
	appendIfExists('Casting Director',    CDirector)
	appendIfExists('Live Action Producer', LAProducer)
	appendIfExists('Director of Photography', DPhoto)
	appendIfExists('Video Editor',        VEditor)
	appendIfExists('Cast',                Cast)
	appendIfExists('Manual',              Manual)
	appendIfExists('Publisher',           ContentPub)
	appendIfExists('Senior Editor',       SrEditor)
	appendIfExists('Editor',              Editor)
	appendIfExists('Cover Art',           CoverArt)
	appendIfExists('Production',          Production)
	
	return html
end

return p