Module:Foreign names

From the Super Mario Wiki, the Mario encyclopedia
Jump to navigationJump to search

Documentation for this module may be created at Module:Foreign names/doc

--[[a table that maps language codes to the english name of the corresponding 
	language. we should just use mw.language.fetchLanguageName for this, but i 
	guess it's broken...? ``mw.language.fetchLanguageName("de", "en")`` returns 
	"Deutsch" even though the documentation says it should return "German"]]
local LANGUAGE_CODES = {
	cs = "Czech",
	da = "Danish",
	de = "German",
	en = "English",
	es = "Spanish",
	fi = "Finnish",
	fr = "French",
	he = "Hebrew",
	hu = "Hungarian",
	it = "Italian",
	ja = "Japanese",
	ko = "Korean",
	nl = "Dutch",
	no = "Norwegian",
	pl = "Polish",
	pt = "Portuguese",
	ro = "Romanian",
	ru = "Russian",
	sv = "Swedish",
	zh = "Chinese",
	["zh-hans"] = "Simplified Chinese",
	["zh-hant"] = "Traditional Chinese",
	
	--[[propritary language codes from template:foreign_names. most of them 
		to match iso 639-2, but one is also literally a racial slur, so i don't
		know whether it's really worth keeping them]]
	cze = "Czech",
	dan = "Danish",
	ger = "German",
	spa = "Spanish",
	fin = "Finnish",
	fra = "French",
	fre = "French",
	heb = "Hebrew",
	hun = "Hungarian",
	ita = "Italian",
	jap = "Japanese",
	kor = "Korean",
	dut = "Dutch",
	nor = "Norwegian",
	pol = "Polish",
	por = "Portuguese",
	rom = "Romanian",
	rus = "Russian",
	swe = "Swedish",
	chi = "Chinese",
	chis = "Simplified Chinese",
	chit = "Traditional Chinese",
}

--allow case-insensitive language codes, show warning if no code was found
setmetatable(LANGUAGE_CODES, {
		__index = function(this, key) 
			local code = rawget(this, string.lower(key))
			if code == nil then
				mw.addWarning("'''WARNING''' (Foreign names): Could not find a language code corresponding to \"" .. mw.text.nowiki(key) .. "\".")
				code = key
			end
			return code
		end
	}
)

--[[splits a string at the first ":" and returns the (whitespace-stripped) 
	characters on either side]]
local function split( value )
	local pos = string.find(value, ":")
	return string.gsub(string.sub(value, 0, pos - 1), '^%s*(.-)%s*$', '%1'), 
		string.gsub(string.sub(value, pos + 1, -1), '^%s*(.-)%s*$', '%1')
end

--[[searches a table t for a member that is evaluated to true by the test 
	function f. if found, return that member. if not, create a new object with
	function m, add it to t, and return it]]
local function getOrCreateMember ( t, f, m )
	for _, value in ipairs(t) do 
		if f(value) then
			return value
		end
	end
	
	local created = m()
	table.insert(t, created)
	return created
end

--[[processes the data from frame.args into an intermediate format that can be
	converted into an html table]]
local function processLangs( arg )
	
	local out = {}
	local lang = {}
	local word = {}
	
	for _, parameter in ipairs(arg) do
    	local name, value
    	if pcall(function () name, value = split(parameter) end) then
	    	name = string.lower(name)
	    	if name == "l" then
	    		decodedValue = LANGUAGE_CODES[value]
	    		lang = getOrCreateMember(out, function(f) return f.l == decodedValue end, function() return {["l"] = decodedValue} end)
	    	elseif name == "w" then
	    		word = getOrCreateMember(lang, function(f) return f.w == value end, function() return {["w"] = value} end)
	    	elseif name == "c" or name == "r" or name == "m" then
	    		word[name] = value
	    	else
	    		mw.addWarning("'''WARNING''' (Foreign names): Could not parse \"" .. mw.text.nowiki(parameter) .. "\".")
	    	end
	    else
	    	mw.addWarning("'''WARNING''' (Foreign names): Could not parse \"" .. mw.text.nowiki(parameter) .. "\".")
	    end
	end
	
	return out
		
end

--generate html for one word
local function processWord(word)
	out = "<td>" .. word.w
	if word.c then
			out = out .. " <small>(" .. word.c .. ")</small>"
	end
	if word.r then
		out = out .. "<br>''" .. word.r .. "''"
	end
	out = out .. "</td>"

	out = out .. "<td>"
	if word.m then
		out = out .. word.m 
	end
	out = out .. "</td></tr><tr>"
	
	return out

end

--generate html for one language
local function processLang(lang) 
	out = "<tr><td rowspan=" .. #lang .. ">" .. lang.l .. "</td>"
	for _, value in ipairs(lang) do
		out = out .. processWord(value)
	end
	out = out .. "</tr>"
	return out
end

local p = {}

--[[entry point, generates an html table of the names of a subject in various 
	languages]]
function p.table( frame )
    
    local langs = processLangs(frame.args)
    
    out = [[<table id="foreignNames" style="background:white;border:1px solid black;border-collapse:collapse;margin-bottom:5px" cellspacing="0" cellpadding="4" border="1">
		<tr><th>Language</th>
		<th>Name</th>
		<th>Meaning</th></tr>]]
    
    for _, value in ipairs(langs) do
    	out = out .. processLang(value)
    end
    
    out = out .. "</table>"
    
    return out
    
end

return p