Zelda Wiki

Want to contribute to this wiki?
Sign up for an account, and get started!

Come join the Zelda Wiki community Discord server!

READ MORE

Zelda Wiki
Advertisement

This is the main module for Template:Nomenclature.

Lua error in package.lua at line 80: module 'Module:Tab2' not found.


local cargo = mw.ext.cargo
local expgame = require('Module:Exp Game')
local tab2 = require('Module:Tab2')
local term = require('Module:Term')
local translation = require('Module:Translation')
local utilsCode = require('Module:UtilsCode')
local utilsGame = require('Module:UtilsGame')
local utilsLanguage = require('Module:UtilsLanguage')
local utilsLocalization = require('Module:UtilsLocalization')
local utilsTable = require('Module:UtilsTable')
local utilsText = require('Module:UtilsText')

local p = {}
local h = {}

-- For creating nomenclature tables
function p.Main( frame )
	local term = frame.args["term"]
	if utilsCode.IsEmpty(term) then
		if utilsLocalization.GetPageLanguage() == "en" then
			term = mw.title.getCurrentTitle().text
		else
			term = mw.title.getCurrentTitle().baseText
		end
	end
	local cargoData = translation.fetchTranslations(term)
	local displayGames = false
	local skipMeanings = true
	for key, row in ipairs(cargoData) do
		if cargoData[1]["game"] ~= row["game"] or utilsGame.IsOrHasRemake(row["game"]) == true then
			displayGames = true
		end
		if not utilsCode.IsEmpty(row["meaning"]) then
			skipMeanings = false
		end
	end
	local resultTable = h.CreateTable(skipMeanings)
	resultTable = h.CreateRows(resultTable, cargoData, skipMeanings, displayGames)
	resultTable:node(mw.html.create("tr"):node(mw.html.create("th"):attr("colspan", "4"):wikitext("<small>This table was generated using [[Data:Translations|translation pages]].<br>To request an addition, please contact a [[Zelda Wiki:Staff|staff member]] with a [[Guidelines:References|reference]].</small>")))
	return resultTable
end

--Create an empty table with headers
function h.CreateTable(skipMeanings)
	--Table structure
	local resultTable = mw.html.create("table")
		:addClass("roundy alternate-rows pill-rows")
		:css{
			["margin"] = "1em 0",
			["font-size"] = "95%",
		}:done()
	
	--Global header
	local headerRow = mw.html.create("tr"):done()
	local headerContent = mw.html.create("th")
		:wikitext("[[File:TMC Forest Minish Artwork.png|20px]] Names in Other Regions [[File:TMC Jabber Nut Sprite.png]]")
		:attr("colspan", "4")
		:css{
			["font-size"] = "110%",
		}:done()
	
	headerRow:node(headerContent)
	resultTable:node(headerRow)
	
	--Individual headers
	--Language
	headerRow = mw.html.create("tr"):done()
	headerContent = mw.html.create("th")
		:wikitext("Language")
		:attr("colspan", "2"):done()
	headerRow:node(headerContent)
	
	--Name
	headerContent = mw.html.create("th")
		:wikitext("Name"):done()
	headerRow:node(headerContent)
	
	--Meaning
	if not skipMeanings then
		headerContent = mw.html.create("th")
			:wikitext("Meaning"):done()
		headerRow:node(headerContent)
	end
	
	resultTable:node(headerRow)
	
	return resultTable
end

function h.CreateRows(output, cargoData, skipMeanings, displayGames)
	h.SortTranslations(cargoData)
	for _, row in ipairs(cargoData) do
		if not row.skip then
			h.ProcessRow(output, cargoData, row, skipMeanings, displayGames)
		end
	end
	
	return output
end

function h.SortTranslations(translations)
	local lookupLang = utilsTable.hash(utilsLanguage.GetCodeSortOrder())
	local lookupGame = utilsTable.hash(utilsGame.GetSortOrder("canon"))
	table.sort(translations, function (a,b)
			if (lookupLang[a.language] or 0) == (lookupLang[b.language] or 0) then
				return (lookupGame[a.game] or 0) < (lookupGame[b.game] or 0)
			else
				return (lookupLang[a.language] or 0) < (lookupLang[b.language] or 0)
			end
		end
	)
end

function h.ProcessRow(output, cargoData, row, skipMeanings, displayGames)
	local meanings = h.GetMeanings(cargoData, row)
	local tr = output:tag('tr')
	h.PrintFlag(tr, row)
	h.PrintLanguage(tr, row)
	h.PrintNames(tr, cargoData, row, displayGames)
	h.MarkRowsToSkip(cargoData, row)
	if not skipMeanings then
		h.PrintMeanings(tr, meanings)
	end
	
end

function h.GetMeanings(cargoData, row)
	local ret = { row.meaning }
	for _, row2 in ipairs(cargoData) do
		if h.SameLangDifTranslations(row, row2) then
			ret[#ret+1] = row2.meaning
		end
	end
	return ret
end

function h.PrintFlag(tr, row)
	tr:tag('td')
		:wikitext(utilsLanguage.CodeToFlag(row.language))
end

function h.PrintLanguage(tr, row)
	tr:tag('td')
		:wikitext(utilsLanguage.CodeToLanguage(row.language))
end

function h.PrintNames(tr, cargoData, row, displayGames)
	local td = tr:tag('td')
		:wikitext(table.concat(h.GetNamesAndTheirGames(cargoData, row, displayGames), '<br>'))
end

function h.GetNamesAndTheirGames(cargoData, row, displayGames)
	local ret = { h.GetOneNameAndGames(cargoData, row, displayGames) }
	for _, row2 in ipairs(cargoData) do
		if h.SameLangDifTranslations(row, row2) then
			games = h.GamesWithSameTranslation(row2, cargoData)
			ret[#ret+1] = h.GetOneNameAndGames(cargoData, row2, displayGames)
		end
	end
	return ret
end

function h.GetOneNameAndGames(cargoData, row, displayGames)
	local games = h.GamesWithSameTranslation(row, cargoData)
	local result = row.translation
	if displayGames == true then
		result = result .. " " .. expgame.Display(games)
	end
	
	local refs = h.RefsWithSameTranslation(row, cargoData)
	for key, ref in ipairs(refs) do
		if not utilsCode.IsEmpty(ref) then
			result = result .. mw.getCurrentFrame():extensionTag("ref", ref)
		end
	end
	return result
end

function h.GamesWithSameTranslation(row, cargoData)
	local ret = {}
	for _, row2 in ipairs(cargoData) do
		if h.SameLangSameTranslation(row, row2) then
			ret[#ret+1] = row2.game
		end
	end
	return ret
end

function h.RefsWithSameTranslation(row, cargoData)
	local ret = {}
	for _, row2 in ipairs(cargoData) do
		if h.SameLangSameTranslation(row, row2) then
			ret[#ret+1] = row2.reference
		end
	end
	return ret
end

function h.SameLangSameTranslation(row1, row2)
	return row1.language == row2.language and row1.translation == row2.translation
end

function h.SameLangDifTranslations(row1, row2)
	return row1.language == row2.language and row1.translation ~= row2.translation
end

function h.SameLang(row1, row2)
	return row1.language == row2.language
end

function h.PrintMeanings(tr, meanings)
	local meaningsDisplays = h.ProcessMeanings(meanings)
	td = tr:tag('td')
		:wikitext(table.concat(meaningsDisplays, '<br>'))
end

function h.MarkRowsToSkip(cargoData, row)
	for _, row2 in ipairs(cargoData) do
		if h.SameLang(row, row2) then
			row2.skip = true
		end
	end
end

function h.ProcessMeanings(meanings)
	local ret = {}
	for k, v in pairs(meanings) do
		if utilsCode.IsEmpty(v) then
			ret[#ret+1] = '&nbsp;'
		else
			ret[#ret+1] = v
		end
	end
	return ret
end

-- TRANSLATION PAGES
function p._CreateTranslationTables(frame)
	local args = frame:getParent().args
	
	local tabs = {}
	local index = 0
	while true do
		index = index + 1
		if utilsCode.IsEmpty(args["tab" .. index]) then
			break
		else
			table.insert(tabs, {tabName = args["tab" .. index], tabContent = args["subjects"]})
		end
	end
	
	return p.CreateTranslationTables(args["game"], args["filetype"], args["header"], tabs, args["subjects"])
end

function p.CreateTranslationTables(game, filetype, header, tabs, subjects)
	local translations = translation.fetchTranslationsByGame(game)
	subjects = mw.text.split(subjects, '%s*,%s*')
	
	if filetype == "Screenshot" then
		filetype = ""
	else
		filetype = " " .. filetype
	end
	
	if utilsCode.IsEmpty(header) then
		header = "Subject"
	end
	
	for key, tab in ipairs(tabs) do
		local languages = mw.text.split(tab["tabName"], '%s*,%s*')
		--Creating tab contents
		local headerRow = mw.html.create("tr")
			:node(mw.html.create("th"):wikitext(header)):done()
		for key2, language in ipairs(languages) do
			headerRow:node(mw.html.create("th"):wikitext(utilsLanguage.CodeToFlag(language) .. "<br>" .. utilsLanguage.CodeToLanguage(language)):css("width", 100 / (#languages + 1) .. "%")):done()
		end
		
		local content = mw.html.create("table")
			:addClass("altrow")
			:css("width", "100%")
			:node(headerRow)
		
		--Creating rows
		for key2, subject in ipairs(subjects) do
			local row = mw.html.create("tr"):node(mw.html.create("td"):addClass("centered"):wikitext("[[File:" .. game .. " " .. term.fetchTerm(game, subject) .. filetype .. ".png|175x175px]]<br><b>" .. term.Main(game, subject, "link", "", nil) .. "</b>"))
			for key3, language in ipairs(languages) do
				outputs = {}
				for key4, translation in ipairs(translations) do
					if translation["term"] == subject then
						if translation["language"] == language then
							table.insert(outputs, translation["translation"])
						end
					end
				end
				
				local cell = mw.html.create("td"):addClass("centered")
				if outputs[1] == "N/A" then
					cell:css("background-color", "var(--zw-dark-2)")
				else
					cell:wikitext(table.concat(outputs, "<br>"))
				end
				
				row:node(cell):done()
			end
			
			content:node(row)
		end
			
		tab["tabContent"] = tostring(content) .. "<small>Return to [[#top|top]]</small>"
		
		-- Formatting tab names
		languages = mw.text.split(string.gsub(table.concat(languages, ", "), "frC, frF", "fr"), '%s*,%s*')
		languages = mw.text.split(string.gsub(table.concat(languages, ", "), "esS, esL", "es"), '%s*,%s*')
		languages = mw.text.split(string.gsub(table.concat(languages, ", "), "ptB, ptP", "pt"), '%s*,%s*')
		languages = mw.text.split(string.gsub(table.concat(languages, ", "), "zhS, zhT", "zh"), '%s*,%s*')
		for key2, language in ipairs(languages) do
			languages[key2] = utilsLanguage.CodeToLanguage(language)
		end
		tab["tabName"] = table.concat(languages, ", ")
	end
	
	if #tabs == 1 then
		return tabs[1]["tabContent"]
	else
		return tab2.Main(tabs, 1, "top", #tabs, "", "", "", "left")
	end
	
end

return p
Advertisement