Jump to content

Module:Wy/si/Wikibase

From Wikimedia Incubator

This module is a package of functions for accessing Wikidata properties which cannot be accessed with #property.

Code Returns
{{#invoke:Wy/si/Wikibase|capital}} name of the "capital" property as listed in the Wikidata item associated with the current page, displayed as a link
{{#invoke:Wy/si/Wikibase|commonslink}} name of the Wikimedia Commons category, as listed in the Wikidata item associated with the current page
{{#invoke:Wy/si/Wikibase|disambig}} true if the Wikidata item corresponds to a Wikipedia disambiguation page
false if it does not
{{#invoke:Wy/si/Wikibase|flag}} filename listed under the "flag" property in the Wikidata item associated with the current page
{{#invoke:Wy/si/Wikibase|id}} ID number of the Wikidata item associated with the current page
{{#invoke:Wy/si/Wikibase|idLink}} ID number of the Wikidata item associated with the current page, in the form of a link to that item
{{#invoke:Wy/si/Wikibase|label}} label of the Wikidata item associated with the current page
{{#invoke:Wy/si/Wikibase|latitude}} decimal latitude as listed in the Wikidata item associated with the current page
{{#invoke:Wy/si/Wikibase|longitude}} decimal longitude as listed in the Wikidata item associated with the current page
{{#invoke:Wy/si/Wikibase|page|Qxxxxx}} name of the local page associated with Wikidata item number Qxxxxx
{{#invoke:Wy/si/Wikibase|sitelink|enwiki}} name of the English Wikipedia page name, as listed in the Wikidata item associated with the current page
enwiki can be replaced with other language codes to obtain corresponding page names for Wikipedia or Wikivoyage in other languages


-- Module:Wikibase
function getId( id )
    if not mw.wikibase then
           return "wikibase module not found"
    end
    
    if id then return id end
    
    entity = mw.wikibase.getEntityObject()
    if not entity then return nil end
    return entity.id
end

-- Returns the link corresponding to the code provided.
function sitelink(dbname)
    if dbname==nil or dbname=='' then
        return ''
    end
    local sl = mw.wikibase.getEntityObject()
    if sl and sl.sitelinks[dbname] then
        return sl.sitelinks[dbname].title
    end
    return ''
end

-- Returns the corresponding geographical coordinates of the item
function coords(typ,fallback)
    if fallback~=nil and fallback~='' and string.match(fallback, '^<%!%-%-.*%-%->$')==nil then
        return fallback
    end
    local item = mw.wikibase.getEntityObject()
    if item~=nil and item.claims~=nil then
        local coords = item.claims.P625
        if coords~=nil and coords[0]~=nil and coords[1]==nil then
            return coords[0].mainsnak.datavalue.value[typ]
        end
    end
    return ''
end

-- Returns the most updated info from a series of statements
function updated(item,prop,frame)
    if item~=nil then
        local claims = item.claims
        if claims~=nil and claims[prop]~=nil then
            for index,claim in pairs(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
                    local val = claim.mainsnak.datavalue.value
                    if val['numeric-id']~=nil then
                        local id = 'Q'..val['numeric-id']
                        local sl = mw.wikibase.sitelink(id)
                        local lb = mw.wikibase.label(id)
                        if sl~=nil and sl~='' then
                            return frame:preprocess('[['..sl..'|'..lb..']]')
                        end
                        return lb
                    end
                    return val
                end
            end
        end
    end
    return ''
end

local p = {}

-- Returns the ID number of the data item linked to the current page.
function p.id(frame)
    id = getId(frame.args[1])
    if id == nil then
           return "(no element found)"
    end
    return id
end


-- Returns the ID number of the data item linked to the current page in the form of a link to Wikidata.
function p.idLink(frame)
    id = getId(frame.args[1])
    if id == nil then
           return "(no element found)"
    end
    return "[[d:" .. id .. "|" .. string.upper(id) .. "]]"
end


-- Returns the label of the data item.
function p.label(frame)
    id = getId(frame.args[1])
    if id == nil then
           return "(no element found)"
    end
    return mw.wikibase.label( id )
end
 
-- Returns the local page of the data item provided.
function p.page(frame)
    id = getId(frame.args[1])
    if id == nil then
           return "(no element found)"
    end
    return mw.wikibase.sitelink( id )
end

-- Returns the link corresponding to the code provided.
function p.sitelink(frame)
    return sitelink(frame.args.dbname or frame.args[1])
end

-- Returns the corresponding link to Wikipedia in English.
function p.enwikilink(frame)
    if frame.args[1]~=nil and frame.args[1]~='' then
        return frame.args[1]
    end
    local sl = sitelink('enwiki')
    if sl~=nil and sl~='' then
        return sl
    end
    local t = mw.title.getCurrentTitle().text
    if t~=nil and t~='' then
        return t
    end
    return ''
end

-- Returns the Commons category of the data item.
function p.commonslink(frame)
    if frame.args[1]~=nil and frame.args[1]~='' then
        return 'Category:'..frame.args[1]
    end
    local item = mw.wikibase.getEntityObject()
    if item~=nil and item.claims~=nil then
        local cat = item.claims.P373
        if cat~=nil and cat[0]~=nil and cat[1]==nil and cat[0].mainsnak.datavalue.value~=nil then
            return 'Category:'..(cat[0].mainsnak.datavalue.value)
        end
    end
    local t = mw.title.getCurrentTitle().text
    if t~=nil and t~='' then
        return 'Category:'..t
    end
    return ''
end

-- Returns the name of the capital or main city.
function p.capital(frame)
    if frame.args[1]~=nil and frame.args[1]~='' then
        return frame.args[1]
    end
    local item = mw.wikibase.getEntityObject()
    return updated(item,'P36',frame)
end

function p.capoluogo(frame)
    return p.capital(frame)
end

function p.valuta(frame)
    if frame.args[1]~=nil and frame.args[1]~='' then
        return frame.args[1]
    end
    local item = mw.wikibase.getEntityObject()
    return updated(item,'P38',frame)
end

-- GET FLAG -- P41 thumb image

function p.flag(frame)
--    if frame.args[1]~=nil and frame.args[1]~='' then
--        return frame.args[1]
--    end
--	local title="" - not using title 
	local arg1 = frame.args[1]
    local item = mw.wikibase.getEntityObject(arg1)
    if item == nil then return end
    local flag = updated(item,'P41',frame)
--	local title = mw.wikibase.sitelink(arg1)    
    if flag ~= nil and flag ~= '' then
		return flag      	
--		return "[[File:" .. flag .. "| thumb | 200px | " .. title .. "]]"
	end
end

-- Restituisce l'etichetta dell'elemento rappresentante la bandiera relativa all'elemento dell'articolo
function p.bandiera_titolo(frame)
    local item = mw.wikibase.getEntityObject()
    if item~=nil then
        local claims = item.claims
        if claims~=nil and claims.P163~=nil and claims.P163[0]~=nil 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 la latitudine corrispondente all'articolo.
function p.latitude(frame)
    return coords('latitude',frame.args[1])
end

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

function p.disambig(frame)
	local item = mw.wikibase.getEntityObject()
	if item~=nil and item.descriptions~=nil then
		local desc = item.descriptions.en
		if desc~=nil and desc.value~=nil and desc.value:lower():find('disambiguation page')~=nil then
			return true
		end
	end
	return false
end
function p.instanceof(arg)
	arg = tonumber(arg.args[1] or arg)
	if item and item.claims and item.claims.P31 then
		local claims = item.claims.P31
		for index, claim in pairs(claims) 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
return p