Documentation for this module may be created at Module:CreditsTable/doc
-- @author Dantman
local p = {}
local names = mw.loadData( 'Module:CreditsTable/names' )
local function parse(text)
local blocks = mw.text.gsplit(mw.text.trim(text), '\n\n+')
local credits = {}
for block in blocks do
local lines = mw.text.split(block, '\n')
local nameline = table.remove(lines, 1)
local credit = {}
local link, name = mw.ustring.match(mw.text.trim(nameline), '^(.+)%[(.+)%]$')
if not link then
name = mw.ustring.match(mw.text.trim(nameline), '^%[(.+)%]$')
if name then
link = nil
else
link = nameline
name = nameline
end
end
credit.link = link and mw.text.trim(link)
credit.name = mw.text.trim(name)
credit.actors = {
EN = {},
JA = {}
}
for ii, line in ipairs(lines) do
lang, person = mw.ustring.match(mw.text.trim(line), '^(%a+): *(.+)$')
lang = mw.ustring.upper(lang)
if lang ~= 'JA' and lang ~= 'EN' then
mw.log(mw.ustring.format("The language %s is not recognized.", lang))
else
table.insert(credit.actors[lang], {
name = person,
link = "imdb:"..person
})
end
end
table.insert(credits, credit)
end
return credits
end
local function link(target, text)
if target then
wt = mw.ustring.format('[[%s|%s]]', target, text)
else
wt = text
end
wt = tostring(mw.html.create('b'):wikitext(wt))
return wt
end
local function render(credits)
local t = mw.html.create('table'):attr('class', "wikitable fill-horiz cell-align-center")
local haseng = false
for i, credit in ipairs(credits) do
if #credit.actors.EN > 0 then
haseng = true
break
end
end
local tr = t:tag('tr')
tr:tag('th'):wikitext("Role")
tr:tag('th'):attr('colspan', 3):wikitext("Seiyū")
if haseng then
tr:tag('th'):wikitext("English Voice Actor")
end
local tr = t:tag('tr')
tr:tag('th'):wikitext("")
tr:tag('th'):wikitext("English")
tr:tag('th'):wikitext("Japanese")
tr:tag('th'):wikitext("Rōmaji")
if haseng then
tr:tag('th')
end
local function actorformat(actors)
local results = {
english = {},
japanese = {},
romaji = {}
}
for i, actor in ipairs(actors) do
table.insert(results.english, link(actor.link, actor.name))
n = names[actor.name] or {}
table.insert(results.japanese, n[1] or '')
table.insert(results.romaji, n[2] or '')
end
results.english = table.concat(results.english, '<br>')
results.japanese = table.concat(results.japanese, '<br>')
results.romaji = table.concat(results.romaji, '<br>')
return results
end
for i, credit in ipairs(credits) do
local jactor = actorformat(credit.actors.JA)
tr = t:tag('tr')
tr:tag('td'):wikitext(link(credit.link, credit.name))
tr:tag('td'):wikitext(jactor.english)
tr:tag('td'):attr('lang', 'ja'):wikitext(jactor.japanese)
tr:tag('td'):wikitext(jactor.romaji)
if haseng then
tr:tag('td'):wikitext(actorformat(credit.actors.EN).english)
end
end
return tostring(t)
end
function p._main(text)
local credits = parse(text)
return render(credits)
end
function p.main(frame)
local text = frame.args[1] or frame:getParent().args[1]
return p._main(text)
end
return p
--[[Category:Lua Modules]]