Modul:WikidataListe: Forskjell mellom sideversjoner

Fra Wikisida.no
Hopp til navigering Hopp til søk
(Tror det var det siste)
(Juster indentering)
Linje 2: Linje 2:


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


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


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


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

resultat = resultat .. "[[Kategori:Artikler hvor " .. param .. " mangler oversettelse]]"
end
return resultat


end
end


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


Linje 135: Linje 138:
local verdiFraFrame = frameverdi(frame,param)
local verdiFraFrame = frameverdi(frame,param)
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
-- 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
-- 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
-- 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 nil -> true (line 66, failed to get property id)
-- not '' -> false (line 71, failed to get claims)
-- 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
-- Similarity is a very difficult concept, and this is way to simple
-- In addition testing of similarity depend on the type of data compared
-- In addition testing of similarity depend on the type of data compared
elseif lang:uc(verdiFraFrame) == lang:uc(verdiFraWikidata) then
elseif lang:uc(verdiFraFrame) == lang:uc(verdiFraWikidata) then
-- avoid pushing anything in between tr-tags
-- 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
-- Inverse of similarity, same problems
elseif string.len(verdiFraWikidata) > 0 then
elseif string.len(verdiFraWikidata) > 0 then
-- avoid pushing anything in between tr-tags
-- 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
-- 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
else
else
return ""
return ""
end
end
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
-- 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
end
end
return ""
return ""
end
end


function p.rad(frame,prop,param)
function p.rad(frame,prop,param)
lang = mw.language.getContentLanguage()
lang = mw.language.getContentLanguage()
local c = velg(frame,prop,param)
local c = velg(frame,prop,param)
local verdiFraFrame = frameverdi(frame,param)
local verdiFraFrame = frameverdi(frame,param)
if verdiFraFrame == "uten" then
if verdiFraFrame == "uten" then
return c -- Dette returnerer kategorien som så vil bli brukt der ellers en infoboks rad hadde vært.
return c -- Dette returnerer kategorien som så vil bli brukt der ellers en infoboks rad hadde vært.
end
end
if string.len(c) >0 then
if string.len(c) >0 then
local t1 = '<tr class="rad" valign="top"><th colspan="2">'
local t1 = '<tr class="rad" valign="top"><th colspan="2">'
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
-- 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
-- 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
return ""
return ""
end
end
end
end



Sideversjonen fra 24. jul. 2015 kl. 02:52

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

-- dead code
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
	-- changing target, breaking user expectation
	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
		-- ref other return values
		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
		-- avoid pushing anything in between tr-tags
		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)
	-- fragile, use P106
	return p.rad(frame,'yrke','yrke')
end

function p.velgYrke(frame)
	-- fragile, use P106
	return velg(frame,'yrke','yrke')
end

function p.radEktefelle(frame)
	-- fragile, use P26
	return p.rad(frame,'ektefelle','ektefelle')
end
function p.radMor(frame)
	-- fragile, use P25
	return p.rad(frame,'mor','mor')
end
function p.radFar(frame)
	-- fragile, use P22
	return p.rad(frame,'far','far')
end
function p.radBarn(frame)
	-- fragile, use P26
	return p.rad(frame,'barn','barn')
end
function p.radBror(frame)
	-- fragile, use P7
	return p.rad(frame,'bror','bror')
end
function p.radSoester(frame)
	-- fragile, use P9
	return p.rad(frame,'søster','søster')
end
function p.radParti(frame)
	-- fragile, use P102
	return p.rad(frame,'parti','parti')
end

return p