Modul:WikidataListe: Forskjell mellom sideversjoner

Fra Wikisida.no
Hopp til navigering Hopp til søk
(Even two missing closing tags)
(Rydder litt. Avlenker yrke.)
Linje 14: Linje 14:
end
end


-- filter(function, table)
function getclaims(frame)
function filter(func, tbl)
local newtbl= {}
for i, v in pairs(tbl) do
if func(v) then
table.insert(newtbl, v)
end
end
return newtbl
end

-- Returns an array of non-deprecated claims for the given property.
-- If there's no Wikidata entity or no claims, an empty array is returned.
function getNonDeprecatedClaims(frame, property)
if not mw.wikibase then
if not mw.wikibase then
return resten
return {}
end
end

local artikkel = mw.wikibase.getEntityObject()
local entity = mw.wikibase.getEntityObject()
if not artikkel then
if not entity then
return resten
return {}
end
end
return artikkel.claims
end


local propertyId = mw.wikibase.resolvePropertyId(property)
-- dead code
if not propertyId then
function wdverdi(pv, first)
return {}
lang = mw.language.getContentLanguage()
end
local num = pv.mainsnak.datavalue.value["numeric-id"]
return "[https://www.wikidata.org/wiki/Q" .. num .. " " .. 'Q' .. num .. "]"
end


claims = entity.claims[propertyId]
function enkeltverdi(pv, first)
if not claims then
lang = mw.language.getContentLanguage()
return {}
-- this happen if data is inconsistent
if not pv.mainsnak then
return ""
end
end

-- Skip inconsistent claims that miss mainsnak
claims = filter(function(claim) return claim.mainsnak end, claims)

-- Skip deprecated claims
claims = filter(function(claim) return claim.rank ~= 'deprecated' end, claims)

return claims
end

-- Returns either "ingen", "ukjent", "" or "Qxxxxxx"
function getValue(claim)
-- special case, there will be no data value if this is set
-- special case, there will be no data value if this is set
if pv.mainsnak.snaktype == 'novalue' then
if claim.mainsnak.snaktype == 'novalue' then
return "''ingen verdi''"
return "ingen"
end
end

-- special case, there will be no data value if this is set
-- special case, there will be no data value if this is set
if pv.mainsnak.snaktype == 'somevalue' then
if claim.mainsnak.snaktype == 'somevalue' then
return "''ukjent verdi''"
return "ukjent"
end
end

-- this happen if data is inconsistent
-- this happen if data is inconsistent
if not pv.mainsnak.datavalue or not pv.mainsnak.datavalue.value then
if not claim.mainsnak.datavalue or not claim.mainsnak.datavalue.value then
return ""
return ""
end
end

-- at this point there should be an ordinary value
-- at this point there should be an ordinary value
local qv = 'Q' .. pv.mainsnak.datavalue.value["numeric-id"]
return 'Q' .. claim.mainsnak.datavalue.value["numeric-id"]
end
local label = mw.wikibase.label(qv)

local sitelink = mw.wikibase.sitelink(qv)
function formatValue(value, first, link)
if label and sitelink then
-- setter link til true som default hvis ingen verdi er angitt
if first then
link = link == nil and true or link
return '[[' .. sitelink .. '|' .. lang:ucfirst(label) .. ']]'

else
if string.sub(value, 1, 1) ~= "Q" then
return '[[' .. sitelink .. '|' .. label .. ']]'
-- Verdien er enten "ukjent" eller "ingen"
end
return string.format("''%s''", value)
end
end

if label and not sitelink then
local label = mw.wikibase.label(value)
if first then
local sitelink = mw.wikibase.sitelink(value)
return lang:ucfirst(label)
if first then
else
local lang = mw.language.getContentLanguage()
label = lang:ucfirst(label)
end

if not link then
-- Vi ønsker kun tekst, ikke wikilenke
if label then
return label
return label
end
end
return ''
end

if label and sitelink then
return '[[' .. sitelink .. '|' .. label .. ']]'
end
if label and not sitelink then
return label
end
end
if sitelink and not label then
if sitelink and not label then
return '[[' .. sitelink .. ']]'
return '[[' .. sitelink .. ']]'
end
end

-- changing target, breaking user expectation
return "[[d:" .. qv .. '|' .. qv .. ']]'
return ''
end
end


-- Returns all values from Wikidata for the given property
function liste(frame,prop,param)
-- If no values are found, an empty string is returned.
local claims = getclaims(frame)
function getFormattedValues(frame, prop, param, link)
if not claims then
local claims = getNonDeprecatedClaims(frame, prop)
return resten
end
local pid = mw.wikibase.resolvePropertyId(prop)
if not pid then
-- ref other return values
return
end


local pv = claims[pid]
local i = 0
if not pv then
return ""
end

local i = 1
local resultat = ''
if #pv > 5 then
resultat = '<div class="mw-collapsible mw-collapsed"><div class="sentrert">' .. #pv .. ' oppføringer</div><div class="mw-collapsible-content">'
end
local manglerOversettelse = false
local manglerOversettelse = false
local first = true
local formattedValues = {}
while i < #claims do
if pv[i]['rank'] ~= 'deprecated' then
i = i + 1
local lres = enkeltverdi(pv[i],true)
local value = getValue(claims[i])
resultat = resultat .. lres
if string.len(lres) == 0 then
if value ~= '' then
local formattedValue = formatValue(value, i == 1, link)
manglerOversettelse = manglerOversettelse or true
if formattedValue == '' then
end
-- Målet har ikke en etikett på norsk bokmål, ei heller en artikkel på nowiki.
first = first and false
-- Vi skriver ut en lenke til Wikidata for å gjøre det enkelt å legge til en etikett.
end
-- For vanlige lesere kan det imidlertid være forvirrende med en Wikidata-lenke,
while i < #pv do
-- så det er ikke helt optimalt. Vi marker derfor også at artikkelen skal legges til
i = i+1
-- i en vedlikeholdskategori.
if pv[i]['rank'] ~= 'deprecated' then
manglerOversettelse = true
local lres = enkeltverdi(pv[i],first)
formattedValue = "[[d:" .. value .. '|' .. value .. ']]'
if string.len(lres) > 0 then
if not first then
resultat = resultat .. ", "
end
resultat = resultat .. lres
first = first and false;
else
manglerOversettelse = manglerOversettelse or true
end
end
table.insert(formattedValues, formattedValue)
end
end
end
if #pv > 5 then
resultat = resultat .. '</div></div>'
end
end

local resultat = table.concat(formattedValues, ", ")

if #formattedValues > 5 then
resultat = string.format([[
<div class="mw-collapsible mw-collapsed">
<div class="sentrert">%s oppføringer</div>
<div class="mw-collapsible-content">%s</div>
</div>
]], #formattedValues, resultat)
end

if manglerOversettelse then
if manglerOversettelse then
-- avoid pushing anything in between tr-tags
resultat = resultat .. "[[Kategori:Artikler hvor " .. param .. " mangler oversettelse]]"
resultat = resultat .. "[[Kategori:Artikler hvor " .. param .. " mangler oversettelse]]"
end
end
return resultat


return resultat
end
end


function frameverdi(frame,param)
function getFrameValue(frame,param)
local args = frame.args
local args = frame.args
if args[1] == nil then
if args[1] == nil then
Linje 142: Linje 168:
end
end
if args[param] then
if args[param] then
return args[param]
return mw.text.trim( args[param] )
end
end
return ""
return ""
Linje 148: Linje 174:


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


function p.yrker(frame)
function p.yrker(frame)
return liste(frame,'P106',"yrke")
return getFormattedValues(frame,'P106',"yrke", false)
end
end


function velg(frame,prop,param)
function velg(frame, prop, param, link)
lang = mw.language.getContentLanguage()
local lang = mw.language.getContentLanguage()
local verdiFraFrame = frameverdi(frame, param)
local verdiFraFrame = getFrameValue(frame, param)
local verdiFraWikidata = liste(frame, prop, param)
local verdiFraWikidata = getFormattedValues(frame, prop, param, link)

if verdiFraFrame then
if verdiFraFrame == "uten" then
-- this does not work because of the way values are passed between templates
-- Hvis malargumentet er satt til "uten" betyr det at det ikke er ønskelig at feltet vises,
-- selv om det finnes data på Wikidata
return "[[Kategori:Artikler hvor " .. param .. " spesifisert som uten]]"
end

if verdiFraWikidata == "" then
-- No value at Wikidata.
if verdiFraFrame == "" then
if verdiFraFrame == "" then
-- return ""
return ""
-- magic number problem, data channel used as signal channel
elseif verdiFraFrame == "uten" then
return "[[Kategori:Artikler hvor " .. param .. " spesifisert som uten]]"
-- 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
end
return verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " mangler på Wikidata]]"
else
return ""
end
end

if verdiFraWikidata then
if string.len(verdiFraWikidata) > 0 then
if verdiFraFrame == "" then
if verdiFraWikidata == "" then
-- avoid pushing anything in between tr-tags
return ""
return verdiFraWikidata .. "[[Kategori:Artikler hvor " .. param .. " hentes fra Wikidata]]"
end
end
return verdiFraWikidata .. "[[Kategori:Artikler hvor " .. param .. " hentes fra Wikidata]]"
end
end

return ""
if lang:uc(verdiFraFrame) == lang:uc(verdiFraWikidata) then
-- Den lokale verdien er helt lik Wikidata-verdien
return verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " samme som på Wikidata]]"
end

-- Den lokale verdien er ikke *helt* lik Wikidata-verdien, men vi vet ikke om det er
-- snakk om betydningsforskjeller.
return verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " forskjellig fra Wikidata]]"
end
end


function rad(frame,prop,param)
function rad(frame,prop,param,link)
lang = mw.language.getContentLanguage()
local lang = mw.language.getContentLanguage()
local c = velg(frame,prop,param)
local value = velg(frame,prop,param,link)
local verdiFraFrame = frameverdi(frame,param)
local verdiFraFrame = getFrameValue(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 value -- 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 value == "" then
local t1 = '<tr class="rad" valign="top"><th colspan="2" class="nowrap">'
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 ""
return ""
end
end
return string.format([[
<tr class="rad" valign="top">
<th colspan="2" class="nowrap">%s</th>
<td colspan="2">%s</td>
</tr>
]], lang:ucfirst(param), value)
end
end


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


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

Sideversjonen fra 14. okt. 2017 kl. 23:30

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

-- filter(function, table)
function filter(func, tbl)
	local newtbl= {}
	for i, v in pairs(tbl) do
		if func(v) then
			table.insert(newtbl, v)
		end
	end
	return newtbl
 end

-- Returns an array of non-deprecated claims for the given property.
-- If there's no Wikidata entity or no claims, an empty array is returned.
function getNonDeprecatedClaims(frame, property)
	if not mw.wikibase then
		return {}
	end

	local entity = mw.wikibase.getEntityObject()
	if not entity then
		return {}
	end

	local propertyId =  mw.wikibase.resolvePropertyId(property)
	if not propertyId then
		return {}
	end

	claims = entity.claims[propertyId]
	if not claims then
		return {}
	end

	-- Skip inconsistent claims that miss mainsnak
	claims = filter(function(claim) return claim.mainsnak end, claims)

	-- Skip deprecated claims
	claims = filter(function(claim) return claim.rank ~= 'deprecated' end, claims)

	return claims
end

-- Returns either "ingen", "ukjent", "" or "Qxxxxxx"
function getValue(claim)
	-- special case, there will be no data value if this is set
	if claim.mainsnak.snaktype == 'novalue' then
		return "ingen"
	end

	-- special case, there will be no data value if this is set
	if claim.mainsnak.snaktype == 'somevalue' then
		return "ukjent"
	end

	-- this happen if data is inconsistent
	if not claim.mainsnak.datavalue or not claim.mainsnak.datavalue.value then
		return ""
	end

	-- at this point there should be an ordinary value
	return 'Q' .. claim.mainsnak.datavalue.value["numeric-id"]
end

function formatValue(value, first, link)
	-- setter link til true som default hvis ingen verdi er angitt
	link = link == nil and true or link

	if string.sub(value, 1, 1) ~= "Q" then
		-- Verdien er enten "ukjent" eller "ingen"
		return string.format("''%s''", value)
	end

	local label = mw.wikibase.label(value)
	local sitelink = mw.wikibase.sitelink(value)
	if first then
		local lang = mw.language.getContentLanguage()
		label = lang:ucfirst(label)
	end

	if not link then
		-- Vi ønsker kun tekst, ikke wikilenke
		if label then
			return label
		end
		return ''
	end

	if label and sitelink then
		return '[[' .. sitelink .. '|' .. label .. ']]'
	end
	if label and not sitelink then
		return label
	end
	if sitelink and not label then
		return '[[' .. sitelink .. ']]'
	end

	return ''
end

-- Returns all values from Wikidata for the given property
-- If no values are found, an empty string is returned.
function getFormattedValues(frame, prop, param, link)
	local claims = getNonDeprecatedClaims(frame, prop)

	local i = 0
	local manglerOversettelse = false
	local formattedValues = {}
	while i < #claims do
		i = i + 1
		local value = getValue(claims[i])
		if value ~= '' then
			local formattedValue = formatValue(value, i == 1, link)
			if formattedValue == '' then
				-- Målet har ikke en etikett på norsk bokmål, ei heller en artikkel på nowiki.
				-- Vi skriver ut en lenke til Wikidata for å gjøre det enkelt å legge til en etikett.
				-- For vanlige lesere kan det imidlertid være forvirrende med en Wikidata-lenke,
				-- så det er ikke helt optimalt. Vi marker derfor også at artikkelen skal legges til
				--  i en vedlikeholdskategori.
				manglerOversettelse = true
				formattedValue = "[[d:" .. value .. '|' .. value .. ']]'
			end
			table.insert(formattedValues, formattedValue)
		end
	end

	local resultat = table.concat(formattedValues, ", ")

	if #formattedValues > 5 then
		resultat = string.format([[
			<div class="mw-collapsible mw-collapsed">
				<div class="sentrert">%s oppføringer</div>
				<div class="mw-collapsible-content">%s</div>
			</div>
		]], #formattedValues, resultat)
	end

	if manglerOversettelse then
		resultat = resultat .. "[[Kategori:Artikler hvor " .. param .. " mangler oversettelse]]"
	end

	return resultat
end

function getFrameValue(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 mw.text.trim( args[param] )
	 end
	 return ""
end

function p.grenserTil(frame)
	return getFormattedValues(frame,'P47',"grenser til")
end

function p.yrker(frame)
	return getFormattedValues(frame,'P106',"yrke", false)
end

function velg(frame, prop, param, link)
	local lang = mw.language.getContentLanguage()
	local verdiFraFrame = getFrameValue(frame, param)
	local verdiFraWikidata = getFormattedValues(frame, prop, param, link)

	if verdiFraFrame == "uten" then
		-- Hvis malargumentet er satt til "uten" betyr det at det ikke er ønskelig at feltet vises,
		-- selv om det finnes data på Wikidata
		return "[[Kategori:Artikler hvor " .. param .. " spesifisert som uten]]"
	end

	if verdiFraWikidata == "" then
		-- No value at Wikidata.
		if verdiFraFrame == "" then
			return ""
		end
		return verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " mangler på Wikidata]]"
	end

	if verdiFraFrame == "" then
		if verdiFraWikidata == "" then
			return ""
		end
		return verdiFraWikidata .. "[[Kategori:Artikler hvor " .. param .. " hentes fra Wikidata]]"
	end

	if lang:uc(verdiFraFrame) == lang:uc(verdiFraWikidata) then
		-- Den lokale verdien er helt lik Wikidata-verdien
		return verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " samme som på Wikidata]]"
	end

	-- Den lokale verdien er ikke *helt* lik Wikidata-verdien, men vi vet ikke om det er
	-- snakk om betydningsforskjeller.
	return verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " forskjellig fra Wikidata]]"
end

function rad(frame,prop,param,link)
	local lang = mw.language.getContentLanguage()
	local value = velg(frame,prop,param,link)
	local verdiFraFrame = getFrameValue(frame,param)
	if verdiFraFrame == "uten" then
		return value  -- Dette returnerer kategorien som så vil bli brukt der ellers en infoboks rad hadde vært.
	end
	if value == "" then
		return ""
	end
	return string.format([[
		<tr class="rad" valign="top">
			<th colspan="2" class="nowrap">%s</th>
			<td colspan="2">%s</td>
		</tr>
	]], lang:ucfirst(param), value)
end

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

function p.velgYrke(frame)
	return velg(frame,'P106','yrke', link)
end
function p.radUtdannet_ved(frame)
	return rad(frame,'P69','utdannet ved')
end
function p.radUtdannelse(frame)
	return rad(frame,'P512','akademisk grad')
end
function p.radDoktorgradsveileder(frame)
	return rad(frame,'P184','doktorgradsveileder')
end
function p.radEktefelle(frame)
	return rad(frame,'P26','ektefelle')
end
function p.radMor(frame)
	return rad(frame,'P25','mor')
end
function p.radFar(frame)
	return rad(frame,'P22','far')
end
function p.radBarn(frame)
	return rad(frame,'P40','barn')
end
function p.radSoesken(frame)
	return rad(frame,'P3373','søsken')
end
function p.radParti(frame)
	return rad(frame,'P102','parti')
end
function p.radBarn(frame)
	return rad(frame,'P40','barn')
end
function p.rad(frame)
	return rad(frame, frame.args['wdp'], frame.args['param'])
end

return p