Modulo:Wikibase
![Info](http://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Lua-Logo.svg/30px-Lua-Logo.svg.png)
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