Vai al contenuto

Modulo:Cita Wikidata

Questa pagina è protetta dallo spostamento
Questa pagina è protetta
Da Wikipedia, l'enciclopedia libera.

Questo modulo serve come supporto per il Template:Cita tramite Wikidata.


require('strict')

local p = {}
local propertyId
local errorMsg = '<span style="font-size:100%" class="error citation-comment">Errore: parametro <code style="color:red;">$1</code> mancante.</span>'

local showWikidataIcon = false
local getArgs = require('Modulo:Arguments').getArgs
local mWikidata = require('Modulo:Wikidata')
local mCitazione = require('Modulo:Citazione')
local pipetrick = require('Modulo:Pipetrick')._pipetrick

-- Funzioni di supporto
local function is_set( var )
	return not (var == nil or var == '');
end

local function is_pattern( str )
	return is_set(str) and str:find('$1')
end

local function getQualifier(qualifierId, conjunction)
	local args = { propertyId, qualifierId, conjunction = conjunction }
	local qualifier = mWikidata._getQualifier(args)
	if qualifier then showWikidataIcon = true end
	return qualifier
end

local function substitute(msg, args)
	return mw.message.newRawMessage(msg, args):plain()
end

-- Funzioni per ricavare dati specifici
local function getAutori()
	local autoriStringa = getQualifier('P2093')
	if is_set(autoriStringa) then
		local autoriConLink = getQualifier('P50', ', ')
		if is_set(autoriConLink) then
			return autoriConLink .. ', ' .. autoriStringa
		else
			return autoriStringa
		end
	else 
		return getQualifier('P50')
	end
end

local function getTitolo()
	local titolo = getQualifier('P1476')
		or getQualifier('P1810')
		or getQualifier('P1932')
		or getQualifier('P742')
		or getQualifier('P554')
		or pipetrick()
	return titolo
end

function p.getCitation(frame)
	local ret
	local args = getArgs(frame)
	
	-- Ritorna un errore se in args mancano i campi medium o prop
	if not is_set(args.medium) then return substitute(errorMsg, 'medium') end
	if not is_set(args.prop)   then return substitute(errorMsg, 'prop')   end
	
	propertyId = args.prop
	
	local identifierFromWD = mWikidata._getProperty( { propertyId } )
	local identifier = args.id
	
	if not is_set(identifier) then
		if identifierFromWD then
			showWikidataIcon = true
			identifier = identifierFromWD
		else
			return substitute(errorMsg, 'id')
		end
	end
	
	local urlType
	if is_pattern(args.url) then
		urlType = 'titolo'
		args.url = substitute(args.url, identifier)
	elseif is_pattern(args.urlcapitolo) then
		urlType = 'capitolo'
		args.urlcapitolo = substitute(args.urlcapitolo, identifier)
	elseif is_pattern(args.url_capitolo) then
		urlType = 'capitolo'
		args.url_capitolo = substitute(args.url_capitolo, identifier)
	end
	
	-- Se un identificatore è specificato, allora si sta forzando l'inserimento manuale;
	-- in tal caso, nessun dato va ricavato da Wikidata, altrimenti si rischierebbero incongruenze fra i dati manuali e quelli automatici
	if identifier == identifierFromWD then
		if not is_set(args.autore) then
			args.autore = getAutori()
		end
		
		if urlType == 'titolo' then
			if not is_set(args.titolo) then
				args.titolo = getTitolo()
			end
		elseif urlType == 'capitolo' then
			if not is_set(args.capitolo) then
				args.capitolo = getTitolo()
			end
		end
		
		if not is_set(args.data) and not is_set(args.anno) then
			args.data = getQualifier('P577')
		end
		
		if not is_set(args.vol) and not is_set(args.volume) then
			args.volume = getQualifier('P478')
		end
		
		if not is_set(args.pagina) and not is_set(args.pagine) then
			args.pagine = getQualifier('P304')
		end
	else
		if urlType == 'titolo' and not is_set(args.titolo) then
			args.titolo = pipetrick()
		elseif urlType == 'capitolo' and not is_set(args.capitolo) then
			args.capitolo = pipetrick()
		end
	end
	
	if args.cid then
		args.cid = substitute(args.cid, identifier)
	end
	
	args.id = nil --non passare l'argomento 'id' al Modulo:Citazione
	
	ret = mCitazione.cita_da_modulo(args.medium, args)

	if showWikidataIcon then
		local mEditAtWikidata = require('Modulo:Modifica su Wikidata')
		ret = ret .. ' ' .. mEditAtWikidata._showMessage({ pid = propertyId })
	end

	return ret
end

return p