Module:WikidataListe
لاسوند لپاره ددې موډيول کېدای سی په Module:WikidataListe/لاسوند کي وي
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 )
assert( property )
local entity = mw.wikibase.getEntity()
if not entity then
return {}
end
local propertyId = mw.wikibase.resolvePropertyId( property ) or 'none'
local claims = ( entity.claims or {} )[propertyId] or {}
claims = filter( function( claim ) return claim.mainsnak end, claims )
claims = filter( function( claim ) return claim.rank ~= 'deprecated' end, claims )
return claims
end
function hasQualifer( claim, qualifier )
assert( claim )
assert( qualifier )
local extracted = ( claim.qualifiers or {} )[qualifier] or {}
return #extracted > 0
end
function formatYearQualifier(claim, qualifier)
assert( claim )
assert( qualifier )
local extracted = ( claim.qualifiers or {} )[qualifier] or {}
if #extracted == 0 then
return ''
end
if extracted[1].snaktype ~= 'value' then
return ''
end
return WikidataDato.aarFraClaim(extracted[1])
end
-- Returns either "ingen", "ukjent", "" or "Qxxxxxx"
function getValue(claim)
assert( claim )
-- map snak type
local mainsnak = claim.mainsnak or {}
if mainsnak.snaktype == 'novalue' then
return "ingen"
elseif mainsnak.snaktype == 'somevalue' then
return "ukjent"
elseif mainsnak.snaktype ~= 'value' then
-- just in case
return ""
end
-- check datatype
if mainsnak.datatype ~= 'wikibase-item' then
return ""
end
local datavalue = mainsnak.datavalue or {}
if datavalue.type ~= 'wikibase-entityid' then
return ""
end
local value = datavalue.value or {}
if value['entity-type'] ~= 'item' then
return ""
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
link = link or true
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 = {}
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 hasQualifer(claim, 'P582') then
local startYear = formatYearQualifier(claim, 'P580') -- fra dato
local endYear = formatYearQualifier(claim, '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 .. "[[وېشنيزه: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)
assert( frame )
return getFormattedValues(frame,'P47',"grenser til")
end
function p.yrker(frame)
assert( frame )
return getFormattedValues(frame,'P106',"دنده", 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 "[[وېشنيزه:Artikler hvor " .. param .. " spesifisert som uten]]"
end
if verdiFraWikidata == "" then
-- No value at Wikidata.
if verdiFraFrame == "" then
return ""
end
return verdiFraFrame .. "[[وېشنيزه:Artikler hvor " .. param .. " mangler på Wikidata]]"
end
if verdiFraFrame == "" then
if verdiFraWikidata == "" then
return ""
end
return verdiFraWikidata .. "[[وېشنيزه: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 .. "[[وېشنيزه: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 .. "[[وېشنيزه:Artikler hvor " .. param .. " forskjellig fra Wikidata]]"
end
function rad( frame, prop, param, link )
assert( frame )
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.nasjonalitet(frame)
assert( frame )
return rad(frame,'P27','هېواد غړيتوب')
end
function p.radYrke(frame)
assert( frame )
return rad(frame,'P106','دنده', false)
end
function p.velgYrke(frame)
assert( frame )
return velg(frame,'P106','دنده', false)
end
function p.radUtdannet_ved(frame)
assert( frame )
return rad(frame,'P69','زده کړې')
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')
end
function p.radEktefelle(frame)
assert( frame )
return rad(frame,'P26','ژوند ملګری', true)
end
function p.radMor(frame)
assert( frame )
return rad(frame,'P25','مور')
end
function p.radFar(frame)
assert( frame )
return rad(frame,'P22','پلار')
end
function p.radBarn(frame)
assert( frame )
return rad(frame,'P40','اولاد')
end
function p.radSoesken(frame)
assert( frame )
return rad(frame,'P3373','ورونه/خويندې')
end
function p.radParti(frame)
assert( frame )
return rad(frame,'P102','ګوند')
end
function p.radBarn(frame)
assert( frame )
return rad(frame,'P40','اولاد')
end
function p.rad(frame)
assert( frame )
return rad(frame, frame.args['wdp'], frame.args['param'])
end
return p