Modul:WikidataListe
![]() | Denne modulen brukes på mer enn 200 000 sider. Det anbefales at endringer testes i en sandkasse før de legges inn. Diskuter gjerne også endringer på diskusjonssiden først. |
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
Lua-feil i linje 569: table index is nil.Lua-feil i linje 55: assertion failed!.Lua-feil i linje 55: assertion failed!.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 WikidataDato = require( 'Module:WikidataDato' ) local refs = require 'Module:Reference score' local p = {} -- The value given to the properties in the table are not significant, they just need to exist local useReferences = { ["P19"] = "fødested", -- fødested ["P20"] = "dødssted", -- dødssted ["P22"] = "far", -- far ["P25"] = "mor", -- mor ["P26"] = "ektefelle", -- ektefelle ["P69"] = "utdannet ved", -- utdannet ved ["P84"] = "arkitekt", -- arkitekt ["P102"] = "medlem av politisk parti", -- medlem av politisk parti ["P106"] = "beskjeftigelse", -- beskjeftigelse ["P119"] = "gravsted", -- gravsted ["P161"] = "medvirkende", -- medvirkende ["P166"] = "utmerkelse", -- utmerkelse ["P3373"] = "søsken" -- søsken } local useCountry = { ["P19"] = "fødested", -- fødested ["P20"] = "dødssted" -- dødssted } local linktext = 'Rediger på Wikidata' local linktarget = 'https://www.wikidata.org/wiki/%s?uselang=%s#%s' local kollapsNum = 5 -- 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 function kollaps(num) if kollapsNum>0 then if num>kollapsNum then return true end end return false 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 getBestStatements( property ) assert( property ) local entity = mw.wikibase.getEntity() if not entity then return {} end return entity:getBestStatements(property) end function hasQualifer( claim, qualifier ) assert( claim ) assert( qualifier ) local qualifiers = claim.qualifiers or {} local snaks = qualifiers[qualifier] or {} return not not snaks[1] end function isStrange( snak ) if not snak then return nil end return snak.snaktype == 'novalue' or snak.snaktype == 'somevalue' or nil end function getStrange( snak ) return (snak.snaktype == 'novalue' and 'ingen') or (snak.snaktype == 'somevalue' and 'ukjent') or nil end function getQualifier( claim, qualifier, strip ) if not claim.qualifiers then return nil end local qualifiers = claim.qualifiers or {} if not qualifiers[qualifier] then return nil end local snaks = qualifiers[qualifier] or {} if not snaks[1] then return nil end local snak = snaks[1] or {} if isStrange( snak ) then return getStrange( snak ) end if not strip then return mw.wikibase.formatValue( snak ) end -- this is to simple for more complex cases return tostring( mw.wikibase.formatValue( snak ) ):gsub("%b<>", "") end function formatYearQualifier(claim, qualifier) assert( claim ) assert( qualifier ) local snaks = ( claim.qualifiers or {} )[qualifier] or {} if not snaks[1] then return nil end local snak = snaks[1] or {} if isStrange( snak ) then return getStrange( snak ) end return WikidataDato.aarFraClaim( snak ) end -- Returns either "ingen", "ukjent", "" or "Qxxxxxx" function getValue(claim) assert( claim ) local mainsnak = claim.mainsnak or {} if isStrange( mainsnak ) then return getStrange( mainsnak ) end -- check datatype if mainsnak.datatype ~= 'wikibase-item' then return nil end local datavalue = mainsnak.datavalue or {} if datavalue.type ~= 'wikibase-entityid' then return nil end local value = datavalue.value or {} if value['entity-type'] ~= 'item' then return nil end -- at this point there should be an ordinary value, but be safe return 'Q' .. ( value["numeric-id"] or 'xxxx') end function formatValue(value, first, link) assert( value ) --assert( first ) -- setter link til true som default hvis ingen verdi er angitt if type( link ) ~= 'boolean' then link = true end 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 and label 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 function formatTimePeriod( claim, first, second ) local startYear = formatYearQualifier(claim, first) -- fra dato or formatYearQualifier(claim, 'P1319') -- tidligste dato or '' -- all fail --do return mw.dumpObject(claim.qualifiers['P1326']) end local startTitle = (hasQualifer(claim, first) and getQualifier(claim, first, true)) or (hasQualifer(claim, 'P1319') and getQualifier(claim, 'P1319', true)) or nil local endYear = formatYearQualifier(claim, second) -- til dato or formatYearQualifier(claim, 'P1326') -- seneste dato or '' -- all fail local endTitle = (hasQualifer(claim, second) and getQualifier(claim, second, true)) or (hasQualifer(claim, 'P1326') and getQualifier(claim, 'P1326', true)) or nil local asterix = mw.html.create( 'sup' ):wikitext( '*' ) if startTitle then local useFallback = (first == 'P1319') or not hasQualifer(claim, first) startYear = mw.html.create( 'span' ) :attr( 'title', string.format("%s: %s", mw.wikibase.getLabel( useFallback and 'P1319' or first ), startTitle )) :wikitext( startYear .. (useFallback and tostring( asterix ) or '')) end if endTitle then local useFallback = (second == 'P1326') or not hasQualifer(claim, second) endYear = mw.html.create( 'span' ) :attr( 'title', string.format("%s: %s", mw.wikibase.getLabel( useFallback and 'P1326' or second ), endTitle )) :wikitext( endYear .. (useFallback and tostring( asterix ) or '')) end return string.format("(%s–%s)", tostring(startYear), tostring(endYear)) end function formatTimePoint( claim ) local pointYear = formatYearQualifier(claim, 'P585') or '' -- all fail local pointTitle = (hasQualifer(claim, 'P585') and getQualifier(claim, 'P585', true)) or nil if pointTitle then pointYear = mw.html.create( 'span' ) :attr( 'title', string.format("%s: %s", mw.wikibase.getLabel( 'P585' ), pointTitle )) :wikitext( pointYear ) end return string.format("(%s)", tostring(pointYear)) end function formatEdit( qid, langCode, prop ) if not qid then return '' end local link = mw.ustring.format( linktarget, qid, langCode, prop ) local text = '[[File:OOjs UI icon edit-ltr-progressive.svg' .. '|frameless|text-top|10px' .. '|alt=' .. mw.text.nowiki( linktext ) .. '|link=' .. mw.text.nowiki( link ) .. '|' .. mw.text.nowiki( linktext ) .. ']]' local html = mw.html.create( 'span' ) :addClass( 'wb-edithandle' ) -- @todo this must be adjusted -- :attr( 'data-bridge-edit-flow', 'single-best-value' ) :wikitext( text ) return tostring( html ) 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,calcRefs) local claims = getBestStatements(prop) local i = 0 local manglerOversettelse = false local formattedValues = {} for i, claim in ipairs(claims) do local value = getValue(claim) 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 if useCountry[prop] then if (hasQualifer(claim, 'P17') or hasQualifer(claim, 'P131')) then local country = getQualifier(claim,"P17") if not country or country == "" then country = getQualifier(claim,"P131") end if country and country ~= '' then formattedValue = formattedValue .. ', ' .. country .. "[[Kategori:Artikler hvor sted presiseres med kvalifikator fra Wikidata]]" end end end -- Dette er egentlig valg av en algoritme, dvs det burde skrives som et pattern if hasQualifer(claim, 'P523') or hasQualifer(claim, 'P524') then formattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P523', 'P524' ) elseif hasQualifer(claim, 'P580') or hasQualifer(claim, 'P582') then formattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P580', 'P582' ) elseif hasQualifer(claim, 'P729') or hasQualifer(claim, 'P730') then formattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P729', 'P730' ) elseif hasQualifer(claim, 'P2031') or hasQualifer(claim, 'P2032') then formattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P2031', 'P2032' ) elseif hasQualifer(claim, 'P3415') or hasQualifer(claim, 'P3416') then formattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P3415', 'P3416' ) elseif hasQualifer(claim, 'P575') then formattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P575' ) elseif hasQualifer(claim, 'P585') then formattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P585' ) elseif hasQualifer(claim, 'P606') then formattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P606' ) elseif hasQualifer(claim, 'P813') then formattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P813' ) elseif hasQualifer(claim, 'P1191') then formattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P1191' ) elseif hasQualifer(claim, 'P1249') then formattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P1249' ) elseif hasQualifer(claim, 'P3999') then formattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P3999' ) elseif hasQualifer(claim, 'P1319') or hasQualifer(claim, 'P1326') then formattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P1319', 'P1326' ) end if formattedValue ~= '' then local tmp = nil if calcRefs == 'Y' and useReferences[prop] then tmp = refs.render(frame, claim.references) end table.insert(formattedValues, formattedValue..(tmp or '')) end end end local resultat = table.concat(formattedValues, ", ") local qid = mw.wikibase.getEntityIdForCurrentPage() local langCode = mw.language.getContentLanguage():getCode() if #formattedValues > 0 then resultat = resultat .. formatEdit( qid, langCode, prop ) end -- use of # to get count will fail in the future if kollaps(#formattedValues) 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, params) 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 -- params kan være én enkelt verdi eller flere verdier adskilt med komma. -- F.eks. vil "religion,livssyn" sjekke både "religion" og "livssyn". for param in mw.text.gsplit( params, ',', true ) do if args[param] then return mw.text.trim( args[param] ) end end return "" end function p.grenserTil(frame) assert( frame ) return getFormattedValues(frame,'P47',"grenser til") end function p.yrker(frame) assert( frame ) return getFormattedValues(frame,'P106',"beskjeftigelse", false) end function _strip( str ) return string.sub( str, 2 , string.len( str )-1 ) end function strip( str ) local lang = mw.language.getContentLanguage() -- Fjern mest mulig formatering fra den lokale verdien local stripped = str:gsub("<span[^>]-wb%-edithandle[^>]*>.-</span>", "") :gsub("%[%[([^%[%]%{%}%|]+)%|([^%[%]%{%}%|]+)%]%]", "%2") stripped = stripped:gsub("%b<>", "") local last = nil repeat last = stripped stripped = stripped:gsub( "(%b[])", _strip ) :gsub( "(%b{})", _strip ) -- not sure if this should be escaped :gsub( "(%b())", _strip ) until ( last == stripped ) stripped = stripped:gsub("''+", "") :gsub("^%s+", "") :gsub("%s+$", "") :gsub("(%s)%s+", "%1") stripped = lang:uc(stripped) return stripped end function velg(frame, prop, param, link) local verdiFraFrame = getFrameValue(frame, param) 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 local calcRefs = 'Y' if verdiFraFrame ~= '' then -- Hvis malargumentet er satt til en lokal verdi betyr det at det ikke er ønskelig -- at feltet vises med lokal data, selv om det finnes data på Wikidata. -- Ikke beregn referanser for at de ikke skal komme med i referanselisten -- Lag Wikidata resultatene slik at det kan sammenlignes og lages vedlikeholdkategorier calcRefs = 'N' end local verdiFraWikidata = getFormattedValues(frame, prop, param, link,calcRefs) 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 strip(verdiFraFrame) == strip(verdiFraWikidata) then -- Den lokale verdien er helt lik Wikidata-verdien return verdiFraWikidata -- .. "[[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, displayName ) assert( frame ) local lang = mw.language.getContentLanguage() local verdiFraFrame = getFrameValue( frame, param ) local value = velg( frame, prop, param, link ) displayName = displayName or lang:ucfirst(param) if verdiFraFrame == "uten" then -- I dette tilfellet har velg() returnert en kategori av typen -- [[Kategori:Artikler hvor {param} spesifisert som uten]]. -- Vi sender denne videre. return value 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> ]], displayName, value) end function p.radYrke(frame) assert( frame ) return rad(frame,'P106','beskjeftigelse', false) end function p.velgYrke(frame) assert( frame ) return velg(frame,'P106','beskjeftigelse', false) end function p.velgIdrettsgren(frame) assert( frame ) return velg(frame,'P641','idrettsgren', true) end function p.velgKlubb(frame) assert( frame ) return velg(frame,'P54','medlem av idrettslag', true) end function p.velgKonkurranseklasse(frame) assert( frame ) return velg(frame,'P2094','konkurranseklasse', false) end function p.radRekord(frame) assert( frame ) return rad(frame,'P2415','personlig rekord') end function p.radHovedkontor(frame) assert( frame ) return rad(frame,'P159','hovedkontor') end function p.radUtdannet_ved(frame) assert( frame ) return rad(frame,'P69','utdannet ved') .. "[[Kategori:Utdatert Metode - WikidataListe]]" end function p.radUtdannelse(frame) assert( frame ) return rad(frame,'P512','akademisk grad') end function p.radDoktorgradsveileder(frame) assert( frame ) return rad(frame,'P184','doktorgradsveileder',true,'Doktorgrads-<br />veileder') end function p.radEktefelle(frame) assert( frame ) return rad(frame,'P26','ektefelle', true) .. "[[Kategori:Utdatert Metode - WikidataListe]]" end function p.radMor(frame) assert( frame ) return rad(frame,'P25','mor') .. "[[Kategori:Utdatert Metode - WikidataListe]]" end function p.radFar(frame) assert( frame ) return rad(frame,'P22','far') .. "[[Kategori:Utdatert Metode - WikidataListe]]" end function p.radBarn(frame) assert( frame ) return rad(frame,'P40','barn') end function p.radSoesken(frame) assert( frame ) return rad(frame,'P3373','søsken') end function p.radParti(frame) assert( frame ) return rad(frame,'P102','parti') .. "[[Kategori:Utdatert Metode - WikidataListe]]" end function p.rad(frame) assert( frame ) if frame.args['ref'] then useReferences[frame.args['wdp']] = "frame.args['param']" end return rad(frame, frame.args['wdp'], frame.args['param'], nil, frame.args['tekst']) end function p.values(frame) assert( frame ) if frame.args['ref'] then useReferences[frame.args['wdp']] = "frame.args['param']" end if frame.args['kollaps'] then kollapsNum = tonumber(frame.args['kollaps']) end return velg(frame, frame.args['wdp'], frame.args['param'], true) end return p