Modulo:Film

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

Modulo a supporto del template {{Film}}.

Dati i parametri paese/paeseN, annouscita, cortometraggio e tipoaudio inseriti manualmente nella voci o letti da Wikidata dalle proprietà paese di origine (P495) e data di pubblicazione (P577) genera la categorizzazione per:

  • Cortometraggi/Film <nazionalità> del <anno>
  • Cortometraggi/Film muti <nazionalità>

--[[
* Modulo a supporto del template Film.
]]--

require('strict')

local getArgs = require('Modulo:Arguments').getArgs
local mWikidata = require('Modulo:Wikidata')
local mDelink = require('Modulo:Delink')
local errorCategory = '[[Categoria:Errori di compilazione del template Film]]'
local p = {}

-- Ricerca i parametri paese/paeseN prima tra args e poi da Wikidata in P495
-- e li restituisce come sequence Lua.
local function getPaesi(args)
	local ret = {}

	if args.paese then
		ret[1] = args.paese
		for key, val in pairs(args) do
			local num = key:match('^paese(%d+)$')
			if num then
				ret[tonumber(num)] = val
			end
		end
	else
		ret = mWikidata._getProperty( { 'P495' }, true ) or {}
	end

	return ret
end

-- Verifica che tutti i valori della sequence contengano lo stesso valore.
-- In caso di successo restituisce quel valore altrimenti nil
local function getUniqueValue(tbl)
	local ret = tbl[1]
	for i = 2, #tbl do
		if tbl[i] ~= tbl[1] then
			ret = nil
			break
		end
	end
	return ret
end

-- Ricerca il parametro annuscita prima tra args (deve essere un wikilink) 
-- e poi da Wikidata in P577 e lo restituisce come stringa senza wikilink.
local function getAnnoUscita(args)
	local ret
	if args.annouscita then
		ret = tonumber(args.annouscita:match('^%[%[(%d+)%]%]$'))
		ret = (ret and ret >= 1880 and ret <= 2030) and tostring(ret) or nil
	else
		ret = mWikidata._getProperty({ 'P577', time = 'year' }, true)
		-- verifica che l'anno sia sempre lo stesso
		if ret then
			ret = getUniqueValue(ret)
		end
	end
	return ret
end

-- Restituisce il maschile plurale degli abitanti del paese specificato usando AggNaz,
-- oppure nil se il paese non esiste. Il paese specificato deve essere un wikilink.
local function getMp(paese)
	local ret
	local values = {
		['Germania Ovest'] = true,
		['Germania Est'] = true,
		['Repubblica Democratica Tedesca'] = true
	}

	if paese:match('^%[%[.-%]%]$') then
		paese = mDelink._main({ paese })
		-- utilizza AggNaz ad eccezione di questi tre valori
		if values[paese] then
			ret = 'tedeschi'
		else
			local title = mw.title.new('Template:AggNaz/' .. paese)
			ret = (title and title.exists) and
				mw.getCurrentFrame():expandTemplate {
					title = title.text,
					args = { 'mp' }
				} or nil
		end
	end

	return ret
end

-- Restituisce le categorie oppurtune per i paesi/annouscita/cortometraggio/tipoaudio specificati
local function getCategories(paesi, annouscita, cortometraggio, tipoaudio)
	local ret = {}

	for _, paese in ipairs(paesi) do
		local mp = getMp(paese)
		if mp then
			local tipo = cortometraggio == 'true' and 'Cortometraggi' or 'Film'
			table.insert(ret, string.format('[[Categoria:%s %s del %s]]', tipo, mp, annouscita))
			if tipoaudio == 'muto' then
				table.insert(ret, string.format('[[Categoria:%s muti %s]]', tipo, mp))
			end
		else
			table.insert(ret, errorCategory)
		end
	end

	return table.concat(ret)
end

-- Entry-point per {{#invoke:Film|categorie}}
function p.categorie(frame)
	local ret, args, paesi

	args = getArgs(frame, {parentOnly = true})
	paesi = getPaesi(args)
	if #paesi > 0 then
		local annouscita = getAnnoUscita(args)
		ret = annouscita and getCategories(paesi, annouscita, args.cortometraggio, args.tipoaudio) or nil
	end

	return ret or errorCategory
end

return p