Module:Nomenclature: Difference between revisions

From Zelda Wiki, the Zelda encyclopedia
Jump to navigation Jump to search
m (unused import)
(update with respect to utilsLanguage)
Line 94: Line 94:


function h.SortTranslations(translations)
function h.SortTranslations(translations)
local lookupLang = utilsTable.hash(utilsLanguage.GetCodeSortOrder())
local lookupLang = utilsTable.hash(utilsLanguage.getCodes())
local lookupGame = utilsTable.hash(utilsGame.GetSortOrder("canon"))
local lookupGame = utilsTable.hash(utilsGame.GetSortOrder("canon"))
table.sort(translations, function (a,b)
table.sort(translations, function (a,b)
Line 108: Line 108:
function h.ProcessRow(output, cargoData, row, skipMeanings, displayGames)
function h.ProcessRow(output, cargoData, row, skipMeanings, displayGames)
local meanings = h.GetMeanings(cargoData, row)
local meanings = h.GetMeanings(cargoData, row)
local langText, flag = utilsLanguage.printLanguage(row.language)
local tr = output:tag('tr')
local tr = output:tag('tr')
h.PrintFlag(tr, row)
:tag("td")
h.PrintLanguage(tr, row)
:addClass("nomenclature-flag")
:wikitext(flag)
:done()
:tag("td")
:wikitext(langText)
:done()
h.PrintNames(tr, cargoData, row, displayGames)
h.PrintNames(tr, cargoData, row, displayGames)
h.MarkRowsToSkip(cargoData, row)
h.MarkRowsToSkip(cargoData, row)
Line 127: Line 133:
end
end
return ret
return ret
end
function h.PrintFlag(tr, row)
tr:tag('td')
:addClass("nomenclature-flag")
:wikitext(utilsLanguage.CodeToFlag(row.language))
end
function h.PrintLanguage(tr, row)
tr:tag('td')
:wikitext(utilsLanguage.CodeToLanguage(row.language))
end
end


Line 268: Line 263:
:node(mw.html.create("th"):wikitext(header)):done()
:node(mw.html.create("th"):wikitext(header)):done()
for key2, language in ipairs(languages) do
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()
local langText, flag = utilsLanguage.printLanguage(language)
headerRow:node(
mw.html.create("th")
:wikitext(flag .. "<br>" .. langText)
:css("width", 100 / (#languages + 1) .. "%")
)
:done()
end
end
Line 305: Line 306:
-- Formatting tab names
-- 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
for key2, language in ipairs(languages) do
languages[key2] = utilsLanguage.CodeToLanguage(language)
languages[key2] = utilsLanguage.printLanguage(language, true)
end
end
languages = utilsTable.unique(languages)
tab["tabName"] = table.concat(languages, ", ")
tab["tabName"] = table.concat(languages, ", ")
end
end

Revision as of 02:18, 5 April 2020

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 utilsTable = require('Module:UtilsTable')

local p = {}
local h = {}

-- For creating nomenclature tables
function p.Main( frame )
	local term = frame.args["term"]
	if utilsCode.IsEmpty(term) then
		term = mw.title.getCurrentTitle().subpageText
	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 <span class='plainlinks'>[https://discord.gg/eJnnvYb contact]</span> 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("wikitable")
		: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|link=]] Names in Other Regions [[File:TMC Jabber Nut Sprite.png|link=]]")
		: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.getCodes())
	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 langText, flag = utilsLanguage.printLanguage(row.language)
	local tr = output:tag('tr')
		:tag("td")
			:addClass("nomenclature-flag")
			:wikitext(flag)
			:done()
		:tag("td")
			:wikitext(langText)
			:done()
	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.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
			local langText, flag = utilsLanguage.printLanguage(language)
			headerRow:node(
				mw.html.create("th")
					:wikitext(flag .. "<br>" .. langText)
					:css("width", 100 / (#languages + 1) .. "%")
				)
				:done()
		end
		
		local content = mw.html.create("table")
			:addClass("wikitable")
			: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 = game, term = subject}) .. filetype .. ".png|150x150px]]<br><b>" .. term.Main({game = game, term = subject, link = "link"}) .. "</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
		for key2, language in ipairs(languages) do
			languages[key2] = utilsLanguage.printLanguage(language, true)
		end
		languages = utilsTable.unique(languages)
		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