Module:Databox Credits
Jump to navigation
Jump to search
Documentation for this module may be created at Module:Databox Credits/doc
-- <nowiki>
--------------------------
-- Module for [[Template:Databox Credits]]
------------------------
local p = {}
-- "imports"
local onmain = require('Module:Mainonly').on_main
local infobox = require('Module:Infobox')
function p.main(frame)
local args = frame:getParent().args
local ret = infobox.new(args)
ret:defineParams{
{ name = 'name', func = 'name' },
-- Crew
{ name = 'director', func = 'has_content'}, -- Director
{ name = 'writer', func = 'has_content' }, -- Writer
{ name = 'music', func = 'has_content' }, -- Music
-- Other
{ name = 'other', func = { name = parseCredit, params = { 'other' } } }, -- Custom
}
ret:setMaxButtons(4)
ret:setAddTSWDataboxClass(true)
ret:create()
ret:cleanParams()
ret:customButtonPlacement(true)
ret:defineLinks({ links = {{ 'Template:%s', 'Databox' },
{ 'Template_talk:%s', 'Talk page' }}, colspan = '2' })
ret:defineName('Databox Credits')
ret:addClass('wikitable')
ret:addButtonsCaption()
-- PARAMETER: name
ret:addRow{
{ tag = 'argh', content = 'name', colspan = '2', class = 'infobox-header' }
}
if ret:paramDefined('director') or ret:paramDefined('writer') or ret:paramDefined('producer') or ret:paramDefined('cinematographer') or ret:paramDefined('editor') or ret:paramDefined('music') then
ret:addRow{
{ tag = 'th', content = 'Crew', colspan = '2', class = 'infobox-header' }
}
end
-- PARAMETER: director
if ret:paramDefined('director') then
ret:addRow{
{ tag = 'th', content = 'Director' },
{ tag = 'argd', content = 'director' }
}
end
-- PARAMETER: writer
if ret:paramDefined('writer') then
ret:addRow{
{ tag = 'th', content = 'Writer' },
{ tag = 'argd', content = 'writer' }
}
end
-- PARAMETER: producer
if ret:paramDefined('producer') then
ret:addRow{
{ tag = 'th', content = 'Producer' },
{ tag = 'argd', content = 'producer' }
}
end
-- PARAMETER: cinematographer
if ret:paramDefined('cinematographer') then
ret:addRow{
{ tag = 'th', content = 'Cinematographer' },
{ tag = 'argd', content = 'cinematographer' }
}
end
-- PARAMETER: editor
if ret:paramDefined('editor') then
ret:addRow{
{ tag = 'th', content = 'Editor' },
{ tag = 'argd', content = 'editor' }
}
end
-- PARAMETER: music
if ret:paramDefined('music') then
ret:addRow{
{ tag = 'th', content = 'Music' },
{ tag = 'argd', content = 'music' }
}
end
-- Other header
if ret:paramDefined('other') then
ret:addRow{
{ tag = 'th', content = 'Other', colspan = '2', class = 'infobox-header' }
}
end
-- PARAMETER: other
if ret:paramDefined('other') then
for k, v in pairs(ret:param('other')) do
ret:addRow{
{ tag = 'th', content = v['role'] },
{ tag = 'td', content = v['credit'] }
}
end
end
ret:finish()
if onmain() then
local a1 = ret:param('all')
local a2 = ret:categoryData()
ret:wikitext(addcategories(a1, a2))
end
return ret:tostring()
end
function parseCredit(str)
local ret = {}
for u in mw.text.gsplit(str, '%s*;%s*') do
local v = mw.text.split(u, '%s*:%s*')
local role = v[1]
local credit = v[2]
if role and credit then
table.insert(ret, { ['role'] = role, ['credit'] = credit })
end
end
return ret
end
function addcategories(args, catargs)
function is_def(x, y)
y = y or 'd'
if infobox.isDefined(x) then
return infobox.isDefined(x[y])
end
return false
end
local ret = {}
local cat_map = {
-- Added if the parameter has content
defined = {
},
-- Added if the parameter has no content
notdefined = {
},
}
-- Run and add mapped categories
for n, v in pairs(cat_map.defined) do
if catargs[n] and catargs[n].one_defined then
table.insert(ret,v)
end
end
for n, v in pairs(cat_map.notdefined) do
if catargs[n] and catargs[n].all_defined == false then
table.insert(ret,v)
end
end
-- combine table and format category wikicode
for i, v in ipairs(ret) do
if (v ~= '') then
ret[i] = string.format('[[Category:%s]]', v)
end
end
return table.concat(ret, '')
end
return p
-- </nowiki>