Narutopedia
Register
Advertisement

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]]
Advertisement