Modulo:Videogioco

Versione del 14 ago 2015 alle 17:01 di Rotpunkt (discussione | contributi) (utilizzo dei tab)
Info Istruzioni per l'uso
Questo è un modulo scritto in Lua. Le istruzioni che seguono sono contenute nella sottopagina Modulo:Videogioco/man (modifica · cronologia)
Sandbox: Modulo:Videogioco/sandbox (modifica · cronologia) · Sottopagine: lista · Test: Modulo:Videogioco/test (modifica · cronologia · esegui)

Modulo Lua di appoggio al template {{Videogioco}}, per gestirne le funzioni di categorizzazione automatica.

Ha una sottopagina di configurazione: Modulo:Videogioco/Configurazione.


--[[  
Questo modulo è in appoggio al template Videogioco, per gestirne le funzioni di 
categorizzazione automatica
]]

local p = {}

local cfg = mw.loadData("Modulo:Videogioco/Configurazione")
local getArgs = require('Module:Arguments').getArgs

local function build_reverse_alias(table_name)
	local reverse_alias = {}
	for alias, name in pairs(cfg['alias_' .. table_name]) do
		if not reverse_alias[name] then reverse_alias[name] = {} end
		table.insert(reverse_alias[name], alias)
	end
	return reverse_alias
end

-- ========================================================================
-- Sostituisce name con il suo alias se presente nella tabella alias
-- quindi ritorna il valore corrispondente dalla tabella values
-- ========================================================================
local function get_category(name, table_name)
	name = cfg['alias_' .. table_name][name] or name
	return cfg[table_name][name]
end

-- ========================================================================
-- Ritorna una lista di categorie per la sequenza di parametri con
-- nome base 'base_name' consultando la tabella 'table'. 
-- 'alias_table' è una tabella di nomi alternativi per i valori dei
-- parametri, 'max_index' il numero massimo dell'indice del parametro
-- da controllare 
-- ========================================================================
local function categorizza(args, base_name, table_name, max_index, lowercase)
	local categories = {}
	if args[base_name] then
		local name_value = args[base_name]
		if lowercase then name_value = mw.ustring.lower(name_value) end
		local category = get_category(name_value, table_name)
		if category then categories[category] = true end
	end
	local index = 1
	local flag_stop = false
	local previous_present = true
	local anomaly = false
	while not flag_stop do
		local name = base_name .. tostring(index)
		if args[name] then
			local name_value = args[name]
			if lowercase then name_value = mw.ustring.lower(name_value) end
			local category = get_category(name_value, table_name)
			if category then categories[category] = true end
			if index > 2 and not previous_present then anomaly = true end
			previous_present = true 
		else
			previous_present = false
		end
		index = index + 1
		if not previous_present and index > max_index then flag_stop = true end
	end
	if args[base_name] and args[base_name .. '1'] then anomaly = true end
	if args[base_name .. '2'] and not (args[base_name] or args[base_name .. '1']) then anomaly = true end
	return categories, anomaly
end

----------------------------------------------------------------------------------
-- categorizza
----------------------------------------------------------------------------------
function p.categorie(frame)
	local args = getArgs(frame, {parentOnly = not frame.args.debug})
	local current_page = mw.title.getCurrentTitle()
	local current_namespace = current_page.namespace
	if current_namespace ~= 0 and not frame.args.debug then return '' end
	local errors_msg = {}
	local categories = {}
	local anomaly = {}
	categories.sviluppo, anomaly.sviluppo = categorizza(args, 'sviluppo', 'aziende', 6)
	categories.pubblicazione, anomaly.pubblicazione = categorizza(args, 'pubblicazione', 'aziende', 3)
	categories.serie, anomaly.serie = categorizza(args, 'serie', 'serie', 3)
	if args.anno then
		categories.anno = {}
		local anno = tonumber(args.anno)
		if anno == nil then
			errors_msg[#errors_msg+1] = 'anno di pubblicazione non valido'
		elseif anno <= 1970 then
			categories.anno['Videogiochi fino al 1970'] = true
		else
			categories.anno['Videogiochi del ' .. anno] = true
		end
	end
	categories.tema, anomaly.tema = categorizza(args, 'tema', 'tema', 3, true)
	categories.genere, anomaly.genere = categorizza(args, 'genere', 'genere', 3, true)
	categories.piattaforme, anomaly.piattaforme = categorizza(args, 'piattaforma', 'piattaforma', 19)
	categories.distribuzione, anomaly.distribuzione = categorizza(args, 'distribuzionedigitale', 'distribuzione', 3)
	local cat_dict = {}
	for cat_name,cat_list in pairs(categories) do
		for cat,_ in pairs(cat_list) do
			cat_dict[cat] = true
		end
	end
	local cat_list = {}
	for cat,_ in pairs(cat_dict) do
		cat_list[#cat_list+1] = '[[Categoria:' .. cat .. ']]'
	end
	if anomaly.sviluppo or anomaly.pubblicazione or anomaly.serie or anomaly.tema or anomaly.piattaforme or anomaly.distribuzione or anomaly.genere then
		cat_list[#cat_list+1] = '[[Categoria:Errori di compilazione del template Videogioco - ordine parametri]]'
	end
	if #errors_msg>0 then 
		cat_list[#cat_list+1] = '[[Categoria:Errori di compilazione del template Videogioco]]'
	end
	if #cat_list == 0 then return '' end
	return frame.args.debug and mw.text.nowiki(table.concat(cat_list)) or table.concat(cat_list)
end

----------------------------------------------------------------------------------
-- Ritorna la configurazione della tabella per le aziende di videogiochi
----------------------------------------------------------------------------------
function p.aziende(frame)
	local args = getArgs(frame)
	local table_name = args[1]
	if not(table_name) then return '' end
	local reverse_alias = build_reverse_alias(table_name)
	local root = mw.html.create('table')
	root
		:addClass('wikitable sortable')
		:tag('tr')
			:tag('th'):wikitext(table_name):done()
			:tag('th'):wikitext('Alias'):done()
			:tag('th'):wikitext('Categoria'):done()
	for name, cat_name in pairs(cfg[table_name]) do
		local name_code = '<nowiki>' .. name .. '</nowiki>'
		local cat_code = '[[:Categoria:' .. cat_name .. ']]'
		local alias_code = '&nbsp;'
		if reverse_alias[name] then
			local alias_code = '<nowiki>' .. table.join(reverse_alias[name], '</nowiki>, <nowiki>') .. '</nowiki>'
		end
		root:tag('tr')
			:tag('td'):wikitext(name_code):done()
			:tag('td'):wikitext(alias_code):done()
			:tag('td'):wikitext(cat_code):done()
	end
	return tostring(root)
end

return p