Modul:WikidataListe: Forskjell mellom sideversjoner
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 |
|||
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 |
end |
||
function getclaims(frame) |
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 |
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 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 |
else |
||
return label |
return label |
||
Linje 60: | Linje 60: | ||
function p.liste(frame,prop) |
function p.liste(frame,prop) |
||
local claims = getclaims(frame) |
|||
if not claims then |
|||
return resten |
|||
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 |
|||
return |
return |
||
end |
end |
||
local pv = claims[pid] |
|||
if not pv then |
|||
return "" |
|||
end |
|||
if not pv[1].mainsnak then |
|||
return "" |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
return "" |
|||
⚫ | |||
end |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
if not first then |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
resultat = resultat .. lres |
|||
if not first then |
|||
⚫ | |||
⚫ | |||
⚫ | |||
-- if not first then |
|||
resultat = resultat .. lres |
|||
first = false; |
|||
⚫ | |||
⚫ | |||
⚫ | |||
-- |
-- if not first then |
||
-- resultat = resultat .. ' <div style="visibility:hidden"> , ' |
|||
⚫ | |||
-- end |
|||
⚫ | |||
⚫ | |||
-- first = false |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
end |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
end |
|||
⚫ | |||
end |
end |
||
function frameverdi(frame,param) |
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 |
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 |
|||
-- 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 |
-- 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 |
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 |
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 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 |
|||
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 |
return t1 .. lang:ucfirst(param) .. t2 .. c .. t3 |
||
else |
|||
return "" |
|||
end |
|||
end |
end |
||
Sideversjonen fra 24. jul. 2015 kl. 02:52
![]() | 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