Module:ElementNames
Jump to navigation
Jump to search
This is a utility module for:
It has 4 outward functions; Three functions that return the entire Element from the various Data Modules(Special, Solid, Liquid, and Gas), and one function to match the pagename for a given element.
elementFromPagename(pagename)
elementFromElementId(eleID)
elementFromLocId(locID)
pagenameFromElement(e)
local p = {}
local i18nde = require("module:i18n/strings/elements")
local _e = function(...) return i18nde["en"][(({...})[1])] end
local function _spaceToUnderscore(str) return str:gsub("%s", "_") end
-- prime game data
local function _addIdx(dt)
local idIdx = {}
local locIdx = {}
for i, v in ipairs(dt) do
idIdx[v.elementId] = i
locIdx[v.localizationID] = i
end
dt.getById = function(self, id) return self[idIdx[id]] end
dt.getByLoc = function(self, loc) return self[locIdx[loc]] end
return dt
end
local dataGa = _addIdx(require("Module:Data/gas"))
local dataLi = _addIdx(require("Module:Data/liquid"))
local dataSo = _addIdx(require("Module:Data/solid"))
local dataSp = _addIdx(require("Module:Data/special"))
local stateData = {
solid = dataSo,
liquid = dataLi,
gas = dataGa,
special = dataSp
}
-- before english localization names were unique, the english wiki choose it's own pagenames
-- the english wikis pagenames are now in line with the english localization
-- to assure backwards compatibility with older scripts these old pagenames must be matched
local pageMatch = {
['Liquid Cobalt'] = 'MoltenCobalt',
['Liquid Copper'] = 'MoltenCopper',
['Liquid Gold'] = 'MoltenGold',
['Liquid Iron'] = 'MoltenIron',
['Liquid Niobium'] = 'MoltenNiobium',
['Liquid Steel'] = 'MoltenSteel',
['Liquid Tungsten'] = 'MoltenTungsten',
['Resin'] = 'SolidResin',
['Methane'] = 'LiquidMethane',
['Naphtha'] = 'Naphtha',
['Nuclear Waste'] = 'NuclearWaste',
['Visco-Gel'] = 'ViscoGel',
['Gas Aluminum'] = 'AluminumGas',
['Gas Aluminium'] = 'AluminumGas',
['Gas Cobalt'] = 'CobaltGas',
['Gas Copper'] = 'CopperGas',
['Gas Gold'] = 'GoldGas',
['Gas Iron'] = 'IronGas',
['Gas Lead'] = 'LeadGas',
['Gas Mercury'] = 'MercuryGas',
['Gas Niobium'] = 'NiobiumGas',
['Gas Steel'] = 'SteelGas',
['Gas Tungsten'] = 'TungstenGas',
['Gas Ethanol'] = 'EthanolGas',
['Gas Carbon'] = 'CarbonGas',
['Chlorine'] = 'ChlorineGas',
['Hydrogen'] = 'HydrogenGas',
['Gas Phosphorus'] = 'PhosphorusGas',
['Gas Sulfur'] = 'SulfurGas',
['Gas Super Coolant'] = 'SuperCoolantGas'
}
local function _locIdFromLocConstructor()
-- invert and filter element strings table for names
local t = {}
local pattern = "^STRINGS%.ELEMENTS%..*%.NAME$"
for key, value in pairs(i18nde["en"]) do
if string.match(key, pattern) then
t[_spaceToUnderscore(value)] = key
end
end
return t
end
local locIdFromLoc = _locIdFromLocConstructor()
-- gets entire Element data from ElementID
local function _eleFromEleId(field, eleID)
for _, state in pairs(field) do
local result = state:getById(eleID)
if result then return result end
end
return _eleFromEleId(field, "Void") -- if fails, return the literal void
end
-- gets entire Element data from LocalizationID
local function _eleFromLocId(field, locID)
for _, state in pairs(field) do
local result = state:getByLoc(locID)
if result then return result end
end
return _eleFromEleId(field, "Void") -- if fails, return the literal void
end
function p.elementFromLocId(locID)
return _eleFromLocId(stateData, locID)
end
function p.elementFromElementId(eleID)
return _eleFromEleId(stateData, eleID)
end
function p.elementFromPagename(pagename)
local eleConstruct = ''
if pageMatch[pagename] then
return _eleFromEleId(stateData, pageMatch[pagename])
end
return _eleFromLocId(stateData, locIdFromLoc[_spaceToUnderscore(pagename)] )
end
function p.pagenameFromElement(e)
return _e(e.localizationID)
end
function p.pagenameFromElementID(eleID)
return _e("STRINGS.ELEMENTS." .. eleID:upper() .. ".NAME")
end
return p