Modul:Wikidata2

Fra Wikipedia, den frie encyklopedi
Hopp til navigering Hopp til søk
Dokumentasjonsikon Moduldokumentasjon [vis] [rediger] [historikk] [oppdater]

Modulen «Wikidata2» inneholder:

  • en funksjon (getValue) som gjør det mulig for skriptet å hente lenkede fra Wikidata ved å angi en gitt ID som første parameter.
  • en funksjon (getRawValue) som gjør det mulig for skriptet å hente ikke-lenkede verdier fra Wikidata ved å angi en gitt ID som første parameter.
  • en funksjon (getDateValue) som gjør det mulig for skriptet å hente datoverdier fra Wikidata ved å angi en gitt ID som første parameter.
  • en funksjon (getValueShortName) som gjør det mulig for skriptet å hente kortnavn (P1813) fra Wikidata ved å angi en gitt ID som første parameter.

Parametere[rediger kilde]

For alle tre funksjoner kan det angis tre ubenevnte parametere: {{#invoke:Wikidata2|funksjon|1|2|3}}.

  • Funksjon kan her være getValue, getRawValue eller getDateValue, avhengig av hva du ønsker å hente ut.
    • getValue returnerer i utgangspunktet en lenke til en artikkel her på norsk bokmålswikipedia. Teksten som vises i lenken, er den etiketten (label) som er angitt på Wikidata. Dersom artikkelen ikke finnes her på norsk bokmål, vil den returnere kun etiketten i ulenket form. Dersom heller ikke etiketten er angitt for norsk bokmål, vil denne funksjonen returnere en tom streng. Når så etikett og artikkel etter hvert blir tilgjengelig på norsk bokmål, vil disse verdiene komme automatisk til syne.
    • getRawValue returnerer i utgangspunktet etiketten i ulenket form. Dersom etiketten ikke er angitt for norsk bokmål, vil denne funksjonen returnere en tom streng. Når så etikett etter hvert blir tilgjengelig på norsk bokmål, vil denne verdien komme automatisk til syne.
    • getDateValue returnerer en datoverdi i ulenket form. Dersom det ikke er angitt noen dato på Wikidata, vil denne funksjonen returnere en tom streng. Når så datoen etter hvert blir lagt inn, vil denne verdien komme automatisk til syne.
  • 1 Her angis ID-en til egenskapen (property) som ønskes hentet fra Wikidata. For eksempel p19 for fødested, p21 for kjønn eller p569 for fødselsdato.
  • 2 Her angis hva som skal vises. Dersom man setter inn hent_wikidata, vil data fra Wikidata returneres og vises. Ellers vises det man skriver inn. Dette gjør det mulig å benytte lokale verdier, for eksempel i en infoboks, fremfor å hente data fra Wikidata.
  • 3 Her angis måten en liste skal deles opp. Setter man inn <br /> vil man få ett element på hver linje. Standard er «, » (komma+mellomrom).

Bruk[rediger kilde]

  • {{#invoke:Wikidata|getValue|p26|}} = returnerer ingenting
  • {{#invoke:Wikidata|getValue|p26|hent_wikidata}} = returnerer den lenkede verdien til egenskap p26 (ektefelle) lagret i Wikidata for den korresponderende artikkelen (for eksempel vil den i artikkelen om Bill Clinton returnere Hillary Rodham Clinton)
  • {{#invoke:Wikidata|getValue|p26|[[Hillary Clinton]]}} = returnerer Hillary Clinton
  • {{#invoke:Wikidata2|getValueShortName|P264|hent_wikidata}} = returnerer den lenkede verdien til egenskap platemerke (P264) lagret i Wikidata for den korresponderende artikkelen (for eksempel vil den i artikkelen om Astrid S returnere [[Universal Music Group|Universal]])


local p = {}

local function parseInput(frame)
	local qid = frame.args.qid
	if qid and (#qid == 0) then qid = nil end
	local propertyID = mw.text.trim(frame.args[1] or "")
	local input_parm = mw.text.trim(frame.args[2] or "")
	if input_parm ~= "hent_wikidata" then
		return false, input_parm, nil, nil
	end
	local entity = mw.wikibase.getEntityObject(qid)
	local claims
	if entity and entity.claims then
		claims = entity.claims[propertyID]
		if not claims then
			return false, "", nil, nil
		end
	else
		return false, "", nil, nil
	end
	return true, entity, claims, propertyID
end
local function isType(claims, type)
	return claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == type
end
local function getValue(entity, claims, propertyID, delim, labelHook) 
	if labelHook == nil then
		labelHook = function (qnumber)
			return nil;
		end
	end
	if isType(claims, "wikibase-entityid") then
		local out = {}
		for k, v in pairs(claims) do
			local qnumber = "Q" .. v.mainsnak.datavalue.value["numeric-id"]
			local sitelink = mw.wikibase.sitelink(qnumber)
			local label = labelHook(qnumber) or mw.wikibase.label(qnumber) or qnumber
			if sitelink then
				out[#out + 1] = "[[" .. sitelink .. "|" .. label .. "]]"
			else
				out[#out + 1] = label
			end
		end
		return table.concat(out, delim)
	else
		-- just return best values
		return entity:formatPropertyValues(propertyID).value
	end
end

-- This is used to get a normal wiki-linked value, or a comma separated list of them if multiple values exist
p.getValue = function(frame)
	if not mw.wikibase then
        return ""
    end
    local propertyID = mw.text.trim(frame.args[1] or "")
    local input_parm = mw.text.trim(frame.args[2] or "")
    local table_separator = mw.text.trim(frame.args[3] or ",")
    if input_parm == "hent_wikidata" then
        local entity = mw.wikibase.getEntityObject()
        if not entity then
        	return ""
    	end
        if entity.claims and entity.claims[propertyID] ~= nil then
            local out = {}
            for k, v in pairs(entity.claims[propertyID]) do
            	if v.mainsnak.datavalue then
            		local numericId = v.mainsnak.datavalue.value["numeric-id"]
            		if numericId then
                    	if (mw.wikibase.sitelink("Q" .. numericId)) and mw.wikibase.label("Q" .. numericId) then
                        	out[#out + 1] = "[[" .. mw.wikibase.sitelink("Q" .. numericId) .. "|" .. mw.wikibase.label("Q" .. numericId) .. "]]"
                    	elseif (mw.wikibase.sitelink("Q" .. numericId)) then
                            out[#out + 1] = "[[" .. mw.wikibase.sitelink("Q" .. numericId) .. "]]"
                        else
                            out[#out + 1] = mw.wikibase.label("Q" .. numericId)
                        end
                    end
                end
            end
            return table.concat(out, table_separator .. ' ')
        else
            return ""
        end
    else
        return input_parm
    end
end

-- This is used to get a value like 'male' (for property p21) which won't be linked
p.getRawValue = function(frame)
	if not mw.wikibase then
        return ""
    end
    local propertyID = mw.text.trim(frame.args[1] or "")
    local input_parm = mw.text.trim(frame.args[2] or "")
    local table_separator = mw.text.trim(frame.args[3] or ",")
    if input_parm == "hent_wikidata" then
        local entity = mw.wikibase.getEntityObject()
                if not entity then
        	return ""
    	end
        if entity.claims[propertyID] ~= nil then
            local out = {}
            for k, v in pairs(entity.claims[propertyID]) do
                out[#out + 1] = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])
            end
            return table.concat(out, table_separator .. ' ')
        else
            return ""
        end
    else
        return input_parm
    end
end

p.getValueShortName = function(frame)
	local go, errorOrentity, claims, propertyID = parseInput(frame)
	if not go then
		return errorOrentity
	end
	local entity = errorOrentity
	-- if wiki-linked value output as link if possible
	local function labelHook (qnumber)
		local label
		local claimEntity = mw.wikibase.getEntity(qnumber)
		if claimEntity ~= nil then
			if claimEntity.claims.P1813 then
				for k2, v2 in pairs(claimEntity.claims.P1813) do
					if v2.mainsnak.datavalue.value.language == "nb" then
						label = v2.mainsnak.datavalue.value.text
					end
					if v2.mainsnak.datavalue.value.language == "en" then
						label = v2.mainsnak.datavalue.value.text
					end
				end
			end
		end
		if label == nil or label == "" then return nil end
		return label
	end
	return getValue(errorOrentity, claims, propertyID, ", ", labelHook);
end

-- This is used to get a date value for date_of_birth (p569), etc. which won't be linked -- consolidate by testing if entity.claims[propertyID].mainsnak.datavalue.type is "time"
p.getDateValue = function(frame)
	if not mw.wikibase then
        return ""
    end
    local propertyID = mw.text.trim(frame.args[1] or "")
    local input_parm = mw.text.trim(frame.args[2] or "")
    local table_separator = mw.text.trim(frame.args[3] or "")
    if input_parm == "hent_wikidata" then
        local entity = mw.wikibase.getEntityObject()
                if not entity then
        	return ""
    	end
        if entity.claims[propertyID] ~= nil then
        	local date_temp = 'ISOtilNorskdato'
            local out = {}
            local dt = {}
            for k, v in pairs(entity.claims[propertyID]) do
                local d = v.mainsnak.datavalue.value.time
                lyear = string.sub(d, 9, 12)
                lmonth = string.sub(d, 14, 15)
                lday = string.sub(d, 17, 18)
                out[#out + 1] = mw.getCurrentFrame():expandTemplate{ title = date_temp, args = { lyear .. "-" .. lmonth ..  "-" .. lday, 'n' } }
            end
            return table.concat(out, table_separator .. ' ')
        else
            return ""
        end
    else
        return input_parm
    end
end

return p