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' | ||
-- 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''' | ||
-- 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=,' | ||
} | } | ||
mw.smw.set( data ) | mw.smw.set( data ) | ||
-- Infobox variables | -- Infobox variables | ||
local infoboxClass = ' | 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) | ||
-- 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('Concept', Concept) | |||
appendIfExists('Concept | appendIfExists('Designer', Designer, 'link') | ||
appendIfExists('Designer | appendIfExists('Credit', table.concat(CreditTable, ', ')) | ||
appendIfExists('Credit | appendIfExists('Graphics', table.concat(GraphicsTable, ', ')) | ||
appendIfExists('Graphics | appendIfExists('Game Idea', GameIdea) | ||
appendIfExists('Game Idea | appendIfExists('Additional Design', ADesign) | ||
appendIfExists('Additional Design | appendIfExists('Producer', Producer) | ||
appendIfExists('Producer | appendIfExists('Writer', Writer) | ||
appendIfExists('Writer | appendIfExists('Art Director', ArtDirector) | ||
appendIfExists('Art Director | appendIfExists('Technical Director', TechDirector) | ||
appendIfExists('Technical Director | appendIfExists('Assistant Producer', AProducer) | ||
appendIfExists('Assistant Producer | appendIfExists('Lead Programmer', LProgrammer) | ||
appendIfExists('Lead Programmer | appendIfExists('Senior Programmer', SProgrammer) | ||
appendIfExists('Senior Programmer | appendIfExists('Programmer', Programmer) | ||
appendIfExists('Programmer | appendIfExists('Game Programming', GProgrammer) | ||
appendIfExists('Game Programming | appendIfExists('Additional Programming', AProgrammer) | ||
appendIfExists('Additional Programming | appendIfExists('Lead Animator', LAnimator) | ||
appendIfExists('Lead Animator | appendIfExists('Animation', Animation) | ||
appendIfExists('Animation | appendIfExists('Lead Artist', LArtist) | ||
appendIfExists('Lead Artist | appendIfExists('Art Team', Artists) | ||
appendIfExists('Art Team | appendIfExists('Concept Artist', CArtist) | ||
appendIfExists('Concept Artist | appendIfExists('Additional Artwork', AArtwork) | ||
appendIfExists('Additional Artwork | appendIfExists('Technology Lead', TechLead) | ||
appendIfExists('Technology Lead | appendIfExists('Technology Programming', TProgramming) | ||
appendIfExists('Technology Programming | appendIfExists('Additional Technology Programming', ATProgramming) | ||
appendIfExists('Additional Technology Programming | appendIfExists('QA Lead', QALead) | ||
appendIfExists('QA Lead | appendIfExists('QA', QA) | ||
appendIfExists('QA | appendIfExists('Music', Music) | ||
appendIfExists('Music | appendIfExists('Sound Effects', Sound) | ||
appendIfExists('Sound Effects | appendIfExists('Audio Editor', AudioEdit) | ||
appendIfExists('Audio Editor | appendIfExists('Casting Director', CDirector) | ||
appendIfExists('Casting Director | appendIfExists('Live Action Producer', LAProducer) | ||
appendIfExists('Live Action Producer | appendIfExists('Director of Photography', DPhoto) | ||
appendIfExists('Director of Photography | appendIfExists('Video Editor', VEditor) | ||
appendIfExists('Video Editor | appendIfExists('Cast', Cast) | ||
appendIfExists('Cast | appendIfExists('Manual', Manual) | ||
appendIfExists('Manual | appendIfExists('Publisher', ContentPub) | ||
appendIfExists('Publisher | appendIfExists('Senior Editor', SrEditor) | ||
appendIfExists('Senior Editor | appendIfExists('Editor', Editor) | ||
appendIfExists('Editor | appendIfExists('Cover Art', CoverArt) | ||
appendIfExists('Cover Art | appendIfExists('Production', Production) | ||
appendIfExists('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
