Modulo:Portale

Da Esopedia, l'Enciclopedia dell'[[Ordine Martinista Antico e Tradizionale|O.M.A.T.]] per gli Iniziati.

Modulo Lua per svolgere le funzioni del template {{Portale}}


require('Module:No globals')
--esportazione delle funzioni del modulo
local p = {}

-- testo per il messaggio di errore se non ci sono parametri o sono tutti non esistenti
local novalid_parameter = {
	'Il [[Template:Portale]] necessita di almeno un argomento!',
	'Non sono stati inseriti portali validi nel [[Template:Portale]]'
}

-- layout per i portali (dato che le stringhe saranno usate in una funzione mw.ustring.format 
-- la coppia di caratteri '%s' è il segnaposto per una stringa, mentre per inserire il 
-- carattere % normalmente lo si deve inserire raddoppiato
local row_portals = {
	--1 portale (segnaposto vuoto, è gestito a parte)
	'',
	-- 2 portali
	[=[<tr><td style="padding-right:3px; width:50%%;">%s</td><td style="padding-left:3px; width:50%%;">%s</td></tr>]=], 
	-- 3 portali
	[=[<tr><td style="padding-right:3px; width:33%%;">%s</td><td style="padding-left:3px;  
		padding-right:3px; width:33%%;">%s</td>	<td style="padding-left:3px; width:33%%;">%s</td></tr>]=],
	--4 portali
	[=[<tr><td style="padding-right:3px; width:50%%;">%s</td><td style="padding-left:3px; width:50%%;">%s</td></tr>
		<tr><td style="padding-right:3px;">%s</td><td style="padding-left:3px;">%s</td></tr>]=],
	-- 5 portali
	[=[<tr><td style="padding-right:3px; width:33%%;" colspan="2">%s</td>
		<td style="padding-left:3px; padding-right:3px; width:33%%;" colspan="2">%s</td>
		<td style="padding-left:3px; width:33%%;" colspan="2">%s</td></tr>
		<tr><td style="padding-right:3px; width:50%%;" colspan="3">%s</td>
		<td style="padding-left:3px; width:50%%;" colspan="3">%s</td></tr>]=],
	--6 portali
	[=[<tr><td style="padding-right:3px; width:33%%;">%s</td>
		<td style="padding-left:3px; padding-right:3px; width:33%%;">%s</td>
		<td style="padding-left:3px; width:33%%;">%s</td></tr>
		<tr><td style="padding-right:3px;">%s</td>
		<td style="padding-left:3px; padding-right:3px;">%s</td>
		<td style="padding-left:3px;">%s</td></tr>]=]
}

-- Stringhe specifiche per alcuni portali, quando questi sono gli unici del template
local single_portal = {
	['Astronomia'] = "accedi alle voci di Esopedia che trattano di astronomia e astrofisica",
	['Chimica'] = "il portale della scienza della composizione, delle proprietà e delle trasformazioni della materia",
	['Comunità'] = "entra nella comunità degli autori di Esopedia",
	['Oggetti del profondo cielo'] = "accedi alle voci di Esopedia che trattano di oggetti non stellari",
	['Portali'] = "accedi ai [[WP:Portale|portali]] di Esopedia",
	['Progetti'] = "partecipa ai [[WP:Progetto|progetti]] di Esopedia",
	['Sistema solare'] = "accedi alle voci di Esopedia sugli oggetti del Sistema solare",
	['Stelle'] = "accedi alle voci di Esopedia che trattano di stelle e costellazioni",
	['Telematica'] = "accedi alle voci di Esopedia che parlano di reti, telecomunicazioni e protocolli di rete",
}

-- funzione di utilità per aggiungere elementi a una tabella
local function dump(t, ...)
	local args = {...}
	for _, s in ipairs(args) do
		table.insert(t, s)
	end
end

-- Wrapper di mw.title.exists, verifica sia che name sia valido, sia che esista
local function titleExists(name)
	local title = mw.title.new(name)
	return title and title.exists
end

-- restituisce una categoria di errore solo in ns0
local function get_error_category()
	return mw.title.getCurrentTitle().namespace == 0 and
		   '' or ''
end

-- funzione princpale
function p.portale(frame)
	local getArgs = require('Module:Arguments').getArgs
	local args = getArgs(frame, {removeBlanks = false})
	local lang = mw.language.getContentLanguage()
	local portals = {}
	local bad_portals = {}
	-- tabella per raccogliere gli errori
	local errors_msg = {}

	-- raccoglie in portals e bad_portals i nomi dei portali passati al modulo,
	-- ignorando quelli valorizzati a stringa vuota
	for i, arg in ipairs(args) do
		if arg ~= '' then
			if #portals < 6 then
				local ucarg = lang:ucfirst(arg)
				if titleExists('Portale:' .. ucarg) then
					table.insert(portals, { ucname=ucarg, name=arg })
				else
					table.insert(bad_portals, ucarg)
				end
			else
				dump(errors_msg, 'Il template accetta al massimo sei portali')
				break
			end
		end
	end

	-- ritorna un messaggio di errore se non sono rimasti portali validi
	if #portals == 0 then
		return mw.getCurrentFrame():expandTemplate({
					title = 'avviso',
					args = { tipo = 'importante',
							 testo= novalid_parameter[(#bad_portals == 0 and 1) or 2]
							}
					}) .. get_error_category()
	end
	-- ordina alfabeticamente i nomi
	table.sort(portals, function(a, b) return a.ucname < b.ucname end)
	local reply = { '<table class="noprint" style="width:100%;>'}
	-- Se un solo portale valido tratto a parte
	if #portals == 1 then
		local ucname = portals[1].ucname
		dump(reply, '<tr><td>', mw.getCurrentFrame():expandTemplate({
				title = 'Occhiello',
				args = { icona = portals[1].ucname,
						 titolo = mw.ustring.format('[[Portale:%s|Portale %s]]', ucname, ucname),
						 frase = single_portal[ucname] or mw.ustring.format('accedi alle voci di Esopedia che trattano di %s', portals[1].name)
					}
				}), '</td></tr>')
	else -- da 2 a 6 portali
		-- genero tutti gli occhielli di collegamento in una lista
		local text = {}
		for _,portal in ipairs(portals) do
			text[#text+1] = mw.getCurrentFrame():expandTemplate({
					title = 'Occhiello',
					args = { icona = portal.ucname,
							 titolo = mw.ustring.format('[[Portale:%s|Portale %s]]', portal.ucname, portal.ucname)
						}
					})
		end
		-- carica gli occhielli generati nella tabella di layout
		dump(reply, mw.ustring.format(row_portals[#portals], unpack(text)))
	end
	dump(reply, '</table>')
	-- aggiunge i messaggi di errore per portali non esistenti
	if #bad_portals > 0 then
		if #bad_portals == 1 then
			dump(errors_msg, mw.ustring.format('Il portale %s non esiste', bad_portals[1]))
		else
			dump(errors_msg, mw.ustring.format('I portali: %s non esistono', mw.text.listToText(bad_portals) ))
		end
	end
	for pos, msg in ipairs(errors_msg) do
		errors_msg[pos] = mw.ustring.format('<strong class="error">%s</strong>', msg)
	end
	local error_msg = table.concat(errors_msg, '<br />')
	if #errors_msg > 0 then
		error_msg = error_msg .. get_error_category()
	end
	return table.concat(reply) .. error_msg
end

return p