Module:Nomenclature

local cargo = mw.ext.cargo local expgame = require('Module:Exp Game') 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 utilsText = require('Module:UtilsText')

local p = {} local h = {}

-- For creating nomenclature tables function p.Main( frame ) local cargoData = translation.fetchTranslations(frame.args["term"]) local skipMeanings = true for _, row in ipairs(cargoData) do		if not utilsCode.IsEmpty(row["meaning"]) then skipMeanings = false break end end local resultTable = h.CreateTable(skipMeanings) local resultTable = h.CreateRows(resultTable, cargoData, skipMeanings) return resultTable end

-- For printing a single row in a translation page function p.MainRow (frame) local resultRow = h.CreateNomenclatureRow(frame.args["game"], frame.args["term"], utilsText.split(frame.args["languages"]), frame.args["image"]) return resultRow end

function h.CreateNomenclatureRow(game, term, languages, image) local cargoData = translation.fetchTranslationsByGame(game, term) h.SortTranslations(cargoData) local tr = mw.html.create('tr') h.PrintTerm(tr, game, term, image) for _, lang in ipairs(languages) do		h.PrintNomenclatureNames(tr, cargoData, lang) end return tr end

function h.PrintTerm(tr, game, termToPrint, image) tr:tag('td') :css{ ["text-align"] = "center" }		:wikitext('175x175px ' .. term._Main(game, termToPrint, "link", "", "") .. '') end

function h.PrintNomenclatureNames(tr, cargoData, language) tr:tag('td') :wikitext(table.concat(h.GetNamesFromLanguage(cargoData, language), ' ')) end

function h.GetNamesFromLanguage(cargoData, language) local names = {} for _, row in ipairs(cargoData) do		if row['language'] == language then names[#names+1] = row["translation"] end end return names 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(" Names in Other Regions ") :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) h.SortTranslations(cargoData) for _, row in ipairs(cargoData) do		if not row.skip then h.ProcessRow(output, cargoData, row, skipMeanings) 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) local meanings = h.GetMeanings(cargoData, row) local tr = output:tag('tr') h.PrintFlag(tr, row) h.PrintLanguage(tr, row) h.PrintNames(tr, cargoData, row) 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) local td = tr:tag('td') :wikitext(table.concat(h.GetNamesAndTheirGames(cargoData, row), ' ')) end

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

function h.GetOneNameAndGames(cargoData, row) local games = h.GamesWithSameTranslation(row, cargoData) return ('%s %s'):format(row.translation, expgame.Display(games)) 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.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, ' ')) 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] = ' ' else ret[#ret+1] = v		end end return ret end

return p