Modul:WikidataListe: Forskjell mellom sideversjoner
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 |
|||
⚫ | |||
-- In addition testing of similarity depend on the type of data compared |
|||
⚫ | |||
-- 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
![]() | 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 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