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 WikidataDato = require( 'Module:WikidataDato' ) 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(property) if not mw.wikibase then return {} end local entity = mw.wikibase.getEntity() 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 function hasQualifer(claim, qualifier) if not claim.qualifiers or not claim.qualifiers[qualifier] or #claim.qualifiers[qualifier] == 0 then return false end return true end function formatYearQualifier(claim, qualifier) if not claim.qualifiers or not claim.qualifiers[qualifier] or #claim.qualifiers[qualifier] == 0 then return '' end local qualifier = claim.qualifiers[qualifier][1] if qualifier.snaktype ~= 'value' then return '' end return WikidataDato.aarFraClaim(qualifier) 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 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 -- 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(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 if hasQualifer(claims[i], 'P582') then local startYear = formatYearQualifier(claims[i], 'P580') -- fra dato local endYear = formatYearQualifier(claims[i], 'P582') -- til dato if endYear == '' then -- Ukjent sluttdato, vi skjuler hele oppføringen. Tenk avsluttede ekteskap. -- Men kan være vi burde finne en mer generell løsning i fremtiden. formattedValue = '' else formattedValue = string.format('%s (%s–%s)', formattedValue, startYear, endYear) end end if formattedValue ~= '' then table.insert(formattedValues, formattedValue) end 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', false) 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', true) 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