Modulo:Nazionale

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

Modulo Lua che implementa le funzionalità dei template {{Naz}}, {{NazBD}}, {{NazBA}}, {{NazNB}} e {{NazU}}.


--[[
* Modulo che implementa il template Naz e le varianti NazBD, NazBA, NazNB e NazU.
]]

require('strict')

-- Moduli
local getArgs = require('Modulo:Arguments').getArgs
local mNazioni = require('Modulo:Nazioni')
local mBandiera = require('Modulo:Bandiera')

-- Configurazione
local sports = mw.loadData('Modulo:Nazionale/Sport')

-------------------------------------------------------------------------------
--						   Funzioni di utilità
-------------------------------------------------------------------------------

-- Error handler per xpcall, formatta l'errore
local function errhandler(msg)
	-- se necessita il backtrace usare:
	-- "<pre>" .. debug.traceback(msg) .. "</pre>"
	return string.format('<span style="color:red;">Errore: %s</span>', msg:match('.+:(.+)$'))
end

-- Aggiunge testo alla tabella "t", svolge anche la funzione di concatenatore
local function dumpText(t, ...)
	local arg = {...}
	for _, val in ipairs(arg) do
		table.insert(t, val)
	end
end

-------------------------------------------------------------------------------
--								classe Nazionale
-------------------------------------------------------------------------------

local Nazionale = {}

function Nazionale:new(args, mode)
	local self = {}
	local bArgs = {}

	setmetatable(self, { __index = Nazionale } )

	-- ha unicamente 5 parametri posizionali
	self.sportName = args[1]
	self.nazName = args[2]
	self.sesso = args[3]
	-- con NazU è args[4] usato per gli anni
	self.altro = args[4]
	self.hide = args[5]
	self.mode = mode

	-- ricerca sport e nazione
	self.sport = sports[self.sportName]
	self.naz = mNazioni._main( { self.nazName }, true )

	-- verifica argomenti
	if not self.sport then
		error('il codice sport ' .. (self.sportName or '') .. ' non è valido')
	elseif not self.naz then
		error('la nazionalità ' .. (self.nazName or '') .. ' non è valida')
	end

	-- bandiera
	if self.mode ~= 'NB' then
		bArgs = { self.nazName }
		if self.mode == 'BA' then
			bArgs.dim = '40x40'
		end
		self.bandiera = mBandiera.getClass():new(bArgs)
	end
	
	return self
end

function Nazionale:getWikiText()
	local t = {}
	-- HTML Entity Code per lo spazio
	local SPACE = '&#32;'
	local ret

	dumpText(t, '[[', self.naz.sel and 'Selezione' or 'Nazionale')

	if self.mode == 'U' then
		dumpText(t, SPACE, 'Under-', self.altro)
	elseif self.altro then
		dumpText(t, SPACE, self.altro)
	end

	dumpText(t, ' di ', self.sport, ' ')

	if self.sesso then
		if self.sesso:lower() == 'f' then
			dumpText(t, 'femminile', SPACE)
		elseif self.sesso:lower() == 'm' then
			dumpText(t, 'maschile', SPACE)
		end
	end

	if self.naz.gen then
		dumpText(t, self.naz.gen)
	elseif self.naz.di then
		dumpText(t, self.naz.di,
				 self.naz.di:sub(-1) ~= '\'' and SPACE or '',
				 self.naz.st)
	end

	dumpText(t, '|', self.naz.st)

	if self.mode == 'U' then
		dumpText(t, SPACE, 'U-', self.altro)
	elseif self.altro and not self.hide then
		dumpText(t, SPACE, self.altro)
	end

	dumpText(t, ']]')

	if self.mode == 'NB' then
		ret = table.concat(t)
	elseif self.mode == 'BD' then
		ret = table.concat(t) .. '&nbsp;' .. self.bandiera:getWikiText()
	elseif self.mode == 'BA' then
		ret = self.bandiera:getWikiText() .. '<br />' .. table.concat(t)
	else
		ret = self.bandiera:getWikiText() .. '&nbsp;' .. table.concat(t)
	end

	return ret
end

-------------------------------------------------------------------------------
--								  API
-------------------------------------------------------------------------------

local p = {}

-- Entry-point per {{NazBD}}
function p.nazbd(frame)
	return select(2, xpcall(function()
		return Nazionale:new(getArgs(frame, {parentOnly = true}), 'BD'):getWikiText()
	end, errhandler))
end

-- Entry-point per {{NazBA}}
function p.nazba(frame)
	return select(2, xpcall(function()
		return Nazionale:new(getArgs(frame, {parentOnly = true}), 'BA'):getWikiText()
	end, errhandler))
end

-- Entry-point per {{NazNB}}
function p.naznb(frame)
	return select(2, xpcall(function()
		return Nazionale:new(getArgs(frame, {parentOnly = true}), 'NB'):getWikiText()
	end, errhandler))
end

-- Entry-point per {{NazU}}
function p.nazu(frame)
	return select(2, xpcall(function()
		return Nazionale:new(getArgs(frame, {parentOnly = true}), 'U'):getWikiText()
	end, errhandler))
end

-- Entry-point per {{Naz}}
function p.main(frame)
	return select(2, xpcall(function()
		return Nazionale:new(getArgs(frame, {parentOnly = true})):getWikiText()
	end, errhandler))
end

return p