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
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