Modul:WikidataListe: Forskjell mellom sideversjoner

Fra Wikisida.no
Hopp til navigering Hopp til søk
(Gjør funksjonen rad tilgjengelig utad)
(Some comments)
Linje 132: Linje 132:
local verdiFraWikidata = p.liste(frame,prop)
local verdiFraWikidata = p.liste(frame,prop)
if verdiFraFrame then
if verdiFraFrame then
-- this does not work because of the way values are passed between templates
if verdiFraFrame == "" then
if verdiFraFrame == "" then
-- return ""
-- return ""
-- magic number problem, data channel used as signal channel
elseif verdiFraFrame == "uten" then
elseif verdiFraFrame == "uten" then
return "[[Kategori:Artikler hvor " .. param .. " spesifisert som uten]]"
return "[[Kategori:Artikler hvor " .. param .. " spesifisert som uten]]"
-- p.liste retuns bot strings and nil, but anything not false or nil is true
-- not nil -> true (line 66, failed to get property id)
-- not '' -> false (line 71, failed to get claims)
elseif not verdiFraWikidata then
elseif not verdiFraWikidata then
return verdiFraFrame
return verdiFraFrame
-- Similarity is a very difficult concept, and this is way to simple
elseif lang:uc(verdiFraFrame) == lang:uc(verdiFraWikidata) then
-- In addition testing of similarity depend on the type of data compared
elseif lang:uc(verdiFraFrame) == lang:uc(verdiFraWikidata) then
-- avoid pushing anything in between tr-tags
return verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " samme som på Wikidata]]"
return verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " samme som på Wikidata]]"
-- Inverse of similarity, same problems
elseif string.len(verdiFraWikidata) > 0 then
elseif string.len(verdiFraWikidata) > 0 then
-- avoid pushing anything in between tr-tags
return verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " forskjellig fra Wikidata]]"
return verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " forskjellig fra Wikidata]]"
else
else
-- avoid pushing anything in between tr-tags
return verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " mangler på Wikidata]]"
return verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " mangler på Wikidata]]"
end
end
Linje 150: Linje 161:
if verdiFraWikidata then
if verdiFraWikidata then
if string.len(verdiFraWikidata) > 0 then
if string.len(verdiFraWikidata) > 0 then
-- avoid pushing anything in between tr-tags
return verdiFraWikidata .. "[[Kategori:Artikler hvor " .. param .. " hentes fra Wikidata]]"
return verdiFraWikidata .. "[[Kategori:Artikler hvor " .. param .. " hentes fra Wikidata]]"
end
end
Linje 167: Linje 179:
local t2 = '</th><td colspan="2" >'
local t2 = '</th><td colspan="2" >'
local t3 = '</td></tr>'
local t3 = '</td></tr>'
-- param is the parameter name, it is not in general the same as the header value
-- some of the header strings are very different from the parameter name
return t1 .. lang:ucfirst(param) .. t2 .. c .. t3
return t1 .. lang:ucfirst(param) .. t2 .. c .. t3
else
else

Sideversjonen fra 22. jul. 2015 kl. 01:39

Formål

Å hente data fra Wikidata til infobokser når aktuelle data ikke er gitt lokalt.

Det er mulig å spesifisere at det ikke skal være noe i infoboksen selv om Wikidata skulle ha noe ved å oppgi verdi uten.

Bruk

Modulen brukes normalt ved å legge inn en rad i en infoboks ved:

{{#invoke:WikidataListe/test|rad|<diverse parametre>}}

eller for å hente og formattere en verdi fra Wikidata, enten for en infoboks eller for annen tekst ved:

{{#invoke:WikidataListe/test|verdi|<diverse parametre>}}
Parameter Utelatt Forklaring
qid Identitet til sidens tilkoblede wikidataelement Identiteten til et wikidataelement. Verdiene vil hentes fra dette elementet hvis parameteren har verdi.
pid Identitet til egenskapen på Wikidata som skal hentes. Verdiene som returneres kan være tom, enkeltverdi eller liste
param Navnet til en parameter til infoboksen som kan ha verdi som skal overstyre verdien fra Wikidata.
ref Skal verdiene referansebelegges? "nei" vil forhindre det, ellers blir det referanser.
tekst Verdi av param Tekst i venstrekolonnen for raden, hvis ikke det er det samme som verdien i param.
kollaps 5 Et tall som angir hvor mange verdier som skal vises før listen vises sammenslått. Hvis intet argument er gitt blir verdien 5 brukt.
kval Kvalifikatorer på Wikidata som skal vises. En kommaseparert liste med egenskapsidentifikatorer. Listes i den rekkefølge de skal vises, altså som «kval=Pxxx,Pyyy»
Pxxx Betingelser for enkeltkvalifikator. En kommaseparert liste, men foreløpig kun ett tilgjengelig valg «tittel». Hvis den ikke er gitt, vil etiketten til egenskapen brukes. Altså vil (P1686) vises som «For verk: verksnavn/lenke» «P1686=tittel:verk» vil endre dette til «verk: verksnavn/lenke» mens «P1686=tittel:» vil gi kun verksnavn/lenke.

Eksempel

WikidataListe
norsknavn = {{{norsknavn|{{#invoke:WikidataListe/test|verdi|qid={{{qid|}}}|pid=P1843|ref=Y}}|}}}

for å hente verdi for norsk navn ut fra (P1843). Eksempelvis vil

{{{norsknavn|{{#invoke:WikidataListe/test|verdi|qid=Q503989|pid=P1843|ref=Y}}|}}}

gi

som resultat.

Tilsvarende vil (P1705) for (Q26087)

{{#invoke:WikidataListe/test|verdi|qid=Q26087|pid=P1705|ref=nei}}

gi

For kraftverk vil:

{{#invoke:WikidataListe/test|rad|pid=P2957 |qid= {{{qid|}}}|param=slukeevne|ref=Y}} {{#invoke:WikidataListe/test|rad|pid=P2109 |qid= {{{qid|}}}|param=effekt}} {{#invoke:WikidataListe/test|rad|pid=P4131 |qid= {{{qid|}}}|param=årsproduksjon}}

med qid= Q5645687 ( (Q5645687)) gi verdiene i denne infoboksen


Referanser



local p = {}

function dump( out )
    if type( out ) == 'table' then
        local s = '{ '
        for k,v in pairs( out ) do
                if type( k ) ~= 'number' then k = '"'..k..'"' end
                s = s .. '['..k..'] = ' .. dump( v ) .. ','
        end
        return s .. '} '
    else
        return tostring( out )
    end
end

function getclaims(frame)
   if not mw.wikibase then
        return resten
    end
    local artikkel = mw.wikibase.getEntityObject()
    if not artikkel then
        return resten
    end
    return artikkel.claims	
end

function wdverdi(pv, first)
	lang = mw.language.getContentLanguage()
	local num = pv.mainsnak.datavalue.value["numeric-id"]
	return "[https://www.wikidata.org/wiki/Q" .. num .. " " .. 'Q' .. num .. "]"
end

function enkeltverdi(pv, first)
	lang = mw.language.getContentLanguage()
	local qv = 'Q' .. pv.mainsnak.datavalue.value["numeric-id"]
    local label = mw.wikibase.label(qv)
    local sitelink = mw.wikibase.sitelink(qv)
    if label and sitelink then
    	if first then
        	return '[[' .. sitelink .. '|' .. lang:ucfirst(label) .. ']]'
        else
        	return '[[' .. sitelink .. '|' .. label .. ']]'
        end
    end
    if label and not sitelink then
    	if first then
    		return lang:ucfirst(label)
		else
			return label
		end
		
	end
	if sitelink and not label then
		return '[[' .. sitelink .. ']]'
	end
	return "[[d:" .. qv .. '|' .. qv .. ']]'
end

function p.liste(frame,prop)
    local claims = getclaims(frame)
    if not claims then
        return resten
    end
	local pid =  mw.wikibase.resolvePropertyId(prop)
	if not pid then
		return 
	end
	
    local pv = claims[pid]
    if not pv then
        return ""
    end
    if not pv[1].mainsnak then return "" end
    if not pv[1].mainsnak.datavalue then return "" end
    
    local i = 1
    local resultat = enkeltverdi(pv[i],true)
    local manglerOversettelse = string.len(resultat)==0
    local first = manglerOversettelse
    while i < #pv do
    	i = i+1
    	local lres = enkeltverdi(pv[i],first)
    	if string.len(lres) > 0 then
    		if not first then
    			resultat = resultat .. ", "
    		end
    	    resultat = resultat .. lres
    	    first = false;
    	else
--    		if not first then
--    			resultat = resultat .. ' <div style="visibility:hidden"> , '
--    		end
--    		resultat = resultat .. wdverdi(pv[i]) .. "</div>"
--    		first = false
    		manglerOversettelse = true
    	end
    end
    if manglerOversettelse then
    	resultat = resultat .. "[[Kategori:Artikler hvor " .. param .. " mangler oversettelse]]"
    end
    return resultat


end

function frameverdi(frame,param)
    local args = frame.args
    if args[1] == nil then
        local pFrame = frame:getParent();
        args = pFrame.args;
        for k,v in pairs( frame.args ) do
            args[k] = v;
        end
     end
     if args[param] then
        return args[param]
     end
     return ""
end

function p.grenserTil(frame)
	return p.liste(frame,"grenser til")
end

function p.yrker(frame)
	return p.liste(frame,"yrke")
end

function velg(frame,prop,param)
	lang = mw.language.getContentLanguage()
	local verdiFraFrame = frameverdi(frame,param)
	local verdiFraWikidata = p.liste(frame,prop)
    if verdiFraFrame then
        -- this does not work because of the way values are passed between templates
        if verdiFraFrame == "" then
--            return ""
		-- magic number problem, data channel used as signal channel 
        elseif verdiFraFrame == "uten" then
    	   return "[[Kategori:Artikler hvor " .. param .. " spesifisert som uten]]"
    	-- p.liste retuns bot strings and nil, but anything not false or nil is true
    	-- not nil -> true (line 66, failed to get property id)
    	-- not '' -> false (line 71, failed to get claims)
    	elseif not verdiFraWikidata then
    		return verdiFraFrame
    	-- Similarity is a very difficult concept, and this is way to simple
    	-- In addition testing of similarity depend on the type of data compared
		elseif lang:uc(verdiFraFrame) == lang:uc(verdiFraWikidata) then
    		-- avoid pushing anything in between tr-tags
           return verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " samme som på Wikidata]]"
        -- Inverse of similarity, same problems
        elseif string.len(verdiFraWikidata) > 0 then
    		-- avoid pushing anything in between tr-tags
           return verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " forskjellig fra Wikidata]]"
        else
    		-- avoid pushing anything in between tr-tags
           return verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " mangler på Wikidata]]"
        end
    else
        return ""
    end
    if verdiFraWikidata then
    	if string.len(verdiFraWikidata) > 0 then
    		-- avoid pushing anything in between tr-tags
       		return verdiFraWikidata .. "[[Kategori:Artikler hvor " .. param .. " hentes fra Wikidata]]"
    	end
    end
    return ""
end

function p.rad(frame,prop,param)
	lang = mw.language.getContentLanguage()
    local c = velg(frame,prop,param)
	local verdiFraFrame = frameverdi(frame,param)
	if verdiFraFrame == "uten" then
		return c  -- Dette returnerer kategorien som så vil bli brukt der ellers en infoboks rad hadde vært.
	end
    if string.len(c) >0 then
        local t1 =  '<tr class="rad" valign="top"><th colspan="2">'
        local t2 = '</th><td colspan="2" >'
        local t3 =  '</td></tr>'
        -- param is the parameter name, it is not in general the same as the header value
        -- some of the header strings are very different from the parameter name
   		return  t1 .. lang:ucfirst(param) .. t2 .. c .. t3
    else
    	return ""
    end
end

function p.radYrke(frame)
	return p.rad(frame,'yrke','yrke')
end

function p.velgYrke(frame)
	return velg(frame,'yrke','yrke')
end

function p.radEktefelle(frame)
	return p.rad(frame,'ektefelle','ektefelle')
end
function p.radMor(frame)
	return p.rad(frame,'mor','mor')
end
function p.radFar(frame)
	return p.rad(frame,'far','far')
end
function p.radBarn(frame)
	return p.rad(frame,'barn','barn')
end
function p.radBror(frame)
	return p.rad(frame,'bror','bror')
end
function p.radSoester(frame)
	return p.rad(frame,'søster','søster')
end
function p.radParti(frame)
	return p.rad(frame,'parti','parti')
end

return p