Modulo:Wikibase

Questa pagina è protetta dallo spostamento
Questa pagina è semiprotetta. Può essere modificata solo da utenti registrati
Da Wikivoyage.
Info Istruzioni per l'uso
Questo è un modulo scritto in Lua. Le istruzioni che seguono sono contenute nella sottopagina Modulo:Wikibase/man (modifica · cronologia)
Sandbox: Modulo:Wikibase/sandbox (modifica · cronologia) · Test: Modulo:Wikibase/test (modifica · cronologia · Esegui)

Il modulo Wikibase implementa le funzionalità base di accesso a Wikidata orientate al popolamento del template {{Quickbar}}.



--[[
	Source script:	https://it.wikivoyage.org/wiki/Modulo:Wikibase
	Maintainers:		Andyrom75, Nastoshka
]]

local item = mw.wikibase.getEntityObject()

local function is_defined(s)
	if s and s ~= '' then return s end
	return nil
end

function getId( id )	
	if id then
		return id
	end
	if item then
		return item.id
	end
	return nil
end

-- Restituisce il collegamento corrispondente al codice fornito.
function sitelink(dbname)
	if is_defined(dbname) and item and item:getSitelink(dbname) then
		return item:getSitelink(dbname)
	end
	return ''
end

-- Restituisce le coordinate geografiche corrispondenti all'elemento
function coords(typ, fallback)
	if is_defined(fallback) and string.match(fallback, '^<%!%-%-.*%-%->$') == nil then
		return fallback
	end
	if item and item.claims then
		local coords = item.claims.P625
		if coords and #coords == 1 and coords[1].mainsnak and coords[1].mainsnak.datavalue and coords[1].mainsnak.datavalue.value then
			return coords[1].mainsnak.datavalue.value[typ]
		end
	end
	return ''
end

function normalize_timezone(tz)
	local k = string.gsub(tz, '%+0(%d)$', '+%1')
	k = string.gsub(k, '%+0(%d:%d%d)$', '+%1')
	return string.gsub(k, '(%+%d%d?):00$', '%1')
end

function normalize_timezone_list(list)
	--alphaindexline
	return mw.text.listToText(list)
end

-- Restituisce l'elemento più aggiornato tra una serie di asserzioni
-- TODO: ranks
function aggiornato(prop, frame)
	if item and item.claims and item.claims[prop] then
		for index, claim in pairs(item.claims[prop]) do
			local qual = claim.qualifiers
			if qual == nil or qual.P582 == nil then
				-- P582 è la data di fine, significa che non è il valore attuale
				if claim.mainsnak and claim.mainsnak.datavalue and claim.mainsnak.datavalue.value then
					local val = claim.mainsnak.datavalue.value
					if val['numeric-id'] then
						local id = 'Q'..val['numeric-id']
						local sl = mw.wikibase.sitelink(id)
						local lb = mw.wikibase.label(id)
						if is_defined(sl) then
							return frame:preprocess('[['..sl..'|'..lb..']]')
						end
						return lb
					end
					return val
				end
			end
		end
	end
	return ''
end

local p = {}

-- Restituisce l'ID dell'elemento collegato alla pagina corrente.
function p.id(frame)
	return getId(frame.args[1])
end


-- Restituisce l'ID dell'elemento collegato alla pagina corrente sotto forma di link a Wikidata.
function p.idLink(frame)
	local id = getId(frame.args[1])
	if id then
		return '[[d:' .. id .. '|' .. id .. ']]'
	end
	return '(nessun elemento trovato)'
end


-- Restituisce l'etichetta di un elemento.
function p.label(frame)
	local id = getId(frame.args[1])
	if id then
		   return mw.wikibase.label( id )
	end
	return '(nessun elemento trovato)'
end

-- Restituisce il primo valore non nullo (nell'ordine) tra il: parametro passato in ingresso, etichetta dell'entità Wikidata, nome della pagina.
function p.pagename(frame)
	if frame and is_defined(frame.args[1]) then
		return frame.args[1]
	end
	local id = getId()
	if id then
		   return mw.wikibase.label( id )
	end
	return mw.title.getCurrentTitle().text
end

-- Restituisce la pagina locale dell'elemento di Wikidata fornito.
function p.page(frame)
	local id = getId(frame.args[1])
	if id then
		   return mw.wikibase.sitelink( id )
	end
	return '(nessun elemento trovato)'
end

-- Restituisce il collegamento corrispondente al codice fornito.
function p.sitelink(frame)
	return sitelink(frame.args.dbname or frame.args[1])
end

function p.wikilink(wikiname, frame)
	if frame and is_defined(frame.args[1]) then
		return frame.args[1]
	end
	local sl = sitelink(wikiname)
	if is_defined(sl) then
		return sl
	end
--[[	local t = mw.title.getCurrentTitle().text
	if is_defined(t) then
		return t
	end
	]]
	return ''
end

-- Restituisce il collegamento corrispondente a Wikipedia in italiano.
function p.itwikilink(frame)
	return p.wikilink('itwiki', frame)
end

-- Restituisce il collegamento corrispondente a Wikiquote in italiano.
function p.itwikiquotelink(frame)
	return p.wikilink('itwikiquote', frame)
end

-- Restituisce il collegamento corrispondente a Wikisource in italiano.
function p.itwikisourcelink(frame)
	return p.wikilink('itwikisource', frame)
end

-- Restituisce il collegamento corrispondente a Wikinotizie in italiano.
function p.itwikinewslink(frame)
	return p.wikilink('itwikinews', frame)
end

-- Restituisce il collegamento corrispondente a Wikibooks in italiano.
function p.itwikibookslink(frame)
	return p.wikilink('itwikibooks', frame)
end

-- Restituisce il nome della categoria di Commons collegata all'articolo attraverso Wikidata.
function p.commonslink(frame)
	if frame and is_defined(frame.args[1]) then
		return 'Category:'..frame.args[1]
	end
	if item and item.claims then
		local cat = item.claims.P373
		if cat and #cat == 1 and cat[1].mainsnak and cat[1].mainsnak.datavalue and cat[1].mainsnak.datavalue.value then
			return 'Category:'..(cat[1].mainsnak.datavalue.value)
		end
	end
	return ''
end

function p.sito(frame)
	if frame then
		if is_defined(frame.args[1]) then
			return frame.args[1]
		end
		local parent = frame:getParent()
		if parent then
			local args = parent.args
			if is_defined(args.Sito) then
				return args.Sito
			end
			if is_defined(args['Sito ufficiale']) then
				return args['Sito ufficiale']
			end
		end
	end
	return aggiornato('P856',frame)
end

function p.WDProperty(PID, ExtVar, frame)
	if frame then
		if is_defined(frame.args[1]) then
			return frame.args[1]
		end
		local parent = frame:getParent()
		if parent and is_defined(parent.args[ExtVar]) then
			return parent.args[ExtVar]
		end
	end
	return aggiornato(PID, frame)
end

-- Restituisce il nome della capitale o del capoluogo attuale dell'elemento.
function p.capitale(frame)
	return p.WDProperty('P36', 'Capitale', frame)
end
function p.capoluogo(frame)
	return p.WDProperty('P36', 'Capoluogo', frame)
end

function p.valuta(frame)
	return p.WDProperty('P38', 'Valuta', frame)
end

function p.banner(frame)
	return p.WDProperty('P948', 'Banner', frame)
end

function p.stemma(frame)
	return p.WDProperty('P94', 'Stemma', frame)
end

function p.bandiera(frame)
	return p.WDProperty('P41', 'Bandiera', frame)
end

function p.abitanti(frame)
	return p.WDProperty('P1082', 'Abitanti', frame)
end

function p.stato(frame)
	return p.WDProperty('P17', 'Stato', frame)
end

function p.immagine( frame )
	return p.WDProperty('P18', 'Immagine', frame)
end

function p.localizzazione(frame)
	return p.WDProperty('P242', 'Localizzazione', frame)
end

-- metri sul livello del mare (senza unità)
function p.altitudine( frame )
	
	-- Use the passed param if available, otherwise continue with fetching from Wikidata
	if frame then
		if is_defined(frame.args[1]) then
			return frame.args[1]
		end
	end
	
	local elevation = p.WDProperty('P2044', 'Altitudine', frame)
	if elevation then
		return elevation["amount"]
	end
	return nil
end

function p.unesco(frame)
	return p.WDProperty('P757', 'Unesco', frame)
end

function p.CAP(frame)
	return p.WDProperty('P281', 'CAP', frame)
end

function p.IATA(frame)
	return p.WDProperty('P238', 'IATA', frame)
end

function p.airport_status(frame)
	return p.WDProperty('P5817', 'Status', frame)
end

-- Può essere una città, regione, stato federato etc... 
function p.situato_in(frame)
	return p.WDProperty('P131', 'Unità amministrativa', frame)
end



-- Type of airport (international, domestic, commercial...)
function p.airport_type(frame)
	
	-- Use the passed param if available, otherwise continue with fetching from Wikidata
	if frame and is_defined(frame.args[1]) then
			return frame.args[1]
	end
    
    local airport_type = p.get_instanceof_numeric_ids()
    -- Non davvero plausibile, c'è sempre un instanceof ma chissà...
    if #airport_type == 0 then
    	return ""
    end
	
    -- Define a table mapping Wikidata entity IDs to their corresponding airport types
    local airportCategorization = {
        -- Internazionale
        [644371] = "Internazionale",  -- Aeroporto internazionale
        [10536263] = "Internazionale",  -- Aeroporto internazionale di compagnia

        -- Regionale o Nazionale
        [837800] = "Domestico",  -- Aeroporto nazionale
        [2138424] = "Domestico",  -- Aeroporto regionale

--[[
        -- Specializzato
        [1479818] = "",  -- Aeroporto speciale
        [4811588] = "",  -- Hub di compagnia
        [5419792] = "",  -- Aeroporto esecutivo
        [5196508] = "",  -- Aeroporto privato
        [17144062] = "",  -- Aeroporto senza torre di comando
        [106643740] = "",  -- Aeroporto federale
        [94993988] = "",  -- Aerodromo commerciale
        [117475712] = "",  -- Vertiport

        -- Standard (generic type for airports not fitting other categories)
        [1248784] = "",  -- Scalo
        [20977786] = "",  -- Aeroporto commerciale
        [392406] = "",  -- Aeroporto alternato
        [62782337] = "",  -- Aeroporto di aviazione generale
        [15733670] = "",  -- Aeroporto di partenza
        [15733672] = "",  -- Aeroporto di arrivo
        [55612991] = "",  -- Greenfield Airport
        [109558168] = "",  -- Outstation
]]--
    }
    
    -- Check each airport type against the categorization and return the first match
    for _, item in ipairs(airport_type) do
        local label = airportCategorization[item]
        if is_defined(label) then
            return label
        end
    end

    return '' -- Return empty string if no match is found
end

-- Restituisce l'etichetta dell'elemento rappresentante la bandiera relativa all'elemento dell'articolo
function p.bandiera_titolo(frame)
	if item then
		local claims = item.claims
		if claims and claims.P163 and claims.P163[0] and claims.P163[1] == nil then
			return mw.wikibase.label('Q'..claims.P163[0].mainsnak.datavalue.value['numeric-id'])
		end
	end
	return mw.title.getCurrentTitle().text..' - Bandiera'
end

-- Restituisce l'etichetta dell'elemento rappresentante lo stemma relativo all'elemento dell'articolo
function p.stemma_titolo(frame)
	if item then
		local claims = item.claims
		if claims and claims.P237 and claims.P237[0] and claims.P237[1] == nil then
			return mw.wikibase.label('Q'..claims.P237[0].mainsnak.datavalue.value['numeric-id'])
		end
	end
	return mw.title.getCurrentTitle().text..' - Stemma'
end

-- Restituisce la latitudine corrispondente all'articolo.
function p.latitudine(frame)
	return coords('latitude',frame.args[1])
end

-- Restituisce la longitudine corrispondente all'articolo.
function p.longitudine(frame)
	return coords('longitude',frame.args[1])
end

function p.fuso_orario(frame)
	local link = false
	for i, e in pairs(frame.args) do
		if e == 'link' then
			link = true
			break
		end
	end
	if item and item.claims and item.claims.P421 then
		local zone = {}
		for i, e in pairs(item.claims.P421) do
			local id = e.mainsnak.datavalue.value['numeric-id']
			local z = normalize_timezone(mw.wikibase.label('Q'..id))
			if link then
				z = frame:preprocess('[[d:Q'..id..'|'..z..']]')
			end
			table.insert(zone, z)
		end
		return normalize_timezone_list(zone)
	end
	return ''
end

function p.disambig(frame)
	if p.instanceof(4167410) then
		return true
	end
end

function p.instanceof(arg)
	arg = tonumber(arg.args[1] or arg)
	if item and item.claims and item.claims.P31 then
		for index, claim in pairs(item.claims.P31) do
			if claim.mainsnak and claim.mainsnak.datavalue then
				local val = claim.mainsnak.datavalue.value
				if val and val['numeric-id'] and arg == val['numeric-id'] then
					return true
				end
			end
		end
	end
	return false
end

-- Used to loop through tables to operate with instances of certain types 
-- at moment types of airports but in principles would work also for cities, regions, beaches etc...
function p.get_instanceof_numeric_ids( )
	
	-- Early return se sappiamo che non c'è quel che ci interessa
    if not item or not item.claims or not item.claims['P31'] then
        return nil
    end
	
	local numeric_ids = {}
    for _, claim in pairs(item.claims['P31']) do
        local qual = claim.qualifiers
        -- Proceed if there are no disqualifying qualifiers
        if not qual or not qual.P582 then
            if claim.mainsnak and claim.mainsnak.datavalue and claim.mainsnak.datavalue.value then
                local val = claim.mainsnak.datavalue.value
                if val['numeric-id'] then
                    table.insert(numeric_ids, val['numeric-id'])
                end
            end
        end
    end

    return numeric_ids  -- Return the table (can be empty)
end

return p