Modul:WikidataListe/sandkasse

Moduldokumentasjon

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>}}
ParameterUtelattForklaring
qidIdentitet til sidens tilkoblede wikidataelementIdentiteten til et wikidataelement. Verdiene vil hentes fra dette elementet hvis parameteren har verdi.
pidIdentitet til egenskapen på Wikidata som skal hentes. Verdiene som returneres kan være tom, enkeltverdi eller liste
paramNavnet til en parameter til infoboksen som kan ha verdi som skal overstyre verdien fra Wikidata.
refSkal verdiene referansebelegges? "nei" vil forhindre det, ellers blir det referanser.
tekstVerdi av paramTekst i venstrekolonnen for raden, hvis ikke det er det samme som verdien i param.
kollaps5Et tall som angir hvor mange verdier som skal vises før listen vises sammenslått. Hvis intet argument er gitt blir verdien 5 brukt.
kvalKvalifikatorer på Wikidata som skal vises. En kommaseparert liste med egenskapsidentifikatorer. Listes i den rekkefølge de skal vises, altså som «kval=Pxxx,Pyyy»
PxxxBetingelser 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 for verk (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/sandkasse
Hammeren kraftstasjon
Slukeevne6 m³/s[1]
Effekt4,9 megawatt[1]
Årsproduksjon18 GWh[1]
norsknavn = {{{norsknavn|{{#invoke:WikidataListe/test|verdi|qid={{{qid|}}}|pid=P1843|ref=Y}}|}}}

for å hente verdi for norsk navn ut fra lokalt navn på takson (P1843). Eksempelvis vil

{{{norsknavn|{{#invoke:WikidataListe/test|verdi|qid=Q503989|pid=P1843|ref=Y}}|}}}

gi

sørgekåpe[2]
sørgjekåpe (nn)[2]
fiskesholb (se)[2]

som resultat.

Tilsvarende vil lokalt navn (P1705) for Tromsø (Q26087)

{{#invoke:WikidataListe/test|verdi|qid=Q26087|pid=P1705|ref=nei}}

gi

Tromsø kommune
Tromsø kommune (nn)
Romssa suohkan (se)

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 (Hammeren kraftstasjon (Q5645687)) gi verdiene i denne infoboksen


Referanser


local WikidataDato = require( 'Module:WikidataDato' )local refs = require 'Module:Reference score'local p = {}-- The value given to the properties in the table are not significant, they just need to existlocal useReferences = {["P19"] = "fødested",-- fødested["P20"] = "dødssted",-- dødssted["P22"] = "far",-- far["P25"] = "mor",-- mor["P26"] = "ektefelle",-- ektefelle["P69"] = "utdannet ved",-- utdannet ved["P84"] = "arkitekt",-- arkitekt["P102"] = "medlem av politisk parti",-- medlem av politisk parti["P106"] = "beskjeftigelse",-- beskjeftigelse["P119"] = "gravsted",-- gravsted["P161"] = "medvirkende",-- medvirkende["P166"] = "utmerkelse",-- utmerkelse["P3373"] = "søsken"-- søsken}local useCountry = {["P19"] = "fødested",-- fødested["P20"] = "dødssted"-- dødssted}local katNavn = {["P22"] = "far"}local linktext = 'Rediger på Wikidata'local linktarget = 'https://www.wikidata.org/wiki/%s?uselang=%s#%s'local kollapsNum = 5function kategori(prop,tekst)local tparam = katNavn[prop] or "en eller flere egenskaper"return "[[Kategori:Artikler hvor " .. tparam .. tekstend-- filter(function, table)function filter(func, tbl)local newtbl= {}for i, v in pairs(tbl) doif func(v) thentable.insert(newtbl, v)endendreturn newtblendfunction makeLink(label,sitelink,first,link)if first and label thenlocal lang = mw.language.getContentLanguage()label = lang:ucfirst( label )endif not link then-- Vi ønsker kun tekst, ikke wikilenkeif label thenreturn labelendreturn ''endif label and sitelink thenreturn '[[' .. sitelink .. '|' .. label .. ']]'endif label and not sitelink thenreturn labelendif sitelink and not label thenreturn '[[' .. sitelink .. ']]'endreturn ''endfunction kollaps(num)if kollapsNum>0 thenif num>kollapsNum thenreturn trueendendreturn falseend-- 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 getBestStatements( property, qid )assert( property )local entity = mw.wikibase.getEntity(qid)if not entity thenreturn {}endreturn entity:getBestStatements(property)endfunction getOkStatements(pid,qid)local entity = mw.wikibase.getEntity(qid)if not entity thenreturn {}endlocal claims =  entity:getAllStatements(pid)local tbl = {}for i,claim in ipairs(claims) doif claim.rank == "normal" or claim.rank == "preferred" thentable.insert(tbl,claim)endendreturn tblendfunction hasQualifer( claim, qualifier )assert( claim )assert( qualifier )local qualifiers = claim.qualifiers or {}local snaks = qualifiers[qualifier] or {}return not not snaks[1]endfunction isStrange( snak )if not snak thenreturn nilendreturn snak.snaktype == 'novalue'or snak.snaktype == 'somevalue'or nilendfunction getStrange( snak )return (snak.snaktype == 'novalue' and 'ingen')or (snak.snaktype == 'somevalue' and 'ukjent')or nilendfunction getQualifier( claim, qualifier, strip )if not claim.qualifiers thenreturn nilendlocal qualifiers = claim.qualifiers or {}if not qualifiers[qualifier] thenreturn nilendlocal snaks = qualifiers[qualifier] or {}if not snaks[1] thenreturn nilendlocal snak = snaks[1] or {}if isStrange( snak ) thenreturn getStrange( snak )endif not strip thenreturn mw.wikibase.formatValue( snak )end-- this is to simple for more complex casesreturn tostring( mw.wikibase.formatValue( snak ) ):gsub("%b<>", "")endfunction formatYearQualifier(claim, qualifier)assert( claim )assert( qualifier )local snaks = ( claim.qualifiers or {} )[qualifier] or {}if not snaks[1] thenreturn nilendlocal snak = snaks[1] or {}if isStrange( snak ) thenreturn getStrange( snak )endreturn WikidataDato.aarFraClaim( snak )end-- Returns either "ingen", "ukjent", "" or "Qxxxxxx"function getValue(claim)assert( claim )local mainsnak = claim.mainsnak or {}if isStrange( mainsnak ) thenreturn getStrange( mainsnak )end-- check datatypeif mainsnak.datatype ~= 'wikibase-item' thenreturn nilendlocal datavalue = mainsnak.datavalue or {}if datavalue.type ~= 'wikibase-entityid' thenreturn nilendlocal value = datavalue.value or {}if value['entity-type'] ~= 'item' thenreturn nilend-- at this point there should be an ordinary value, but be safereturn 'Q' .. ( value["numeric-id"] or 'xxxx')endfunction formatValue(value, first, link)assert( value )--assert( first )-- setter link til true som default hvis ingen verdi er angittif type( link ) ~= 'boolean' thenlink = trueendif string.sub(value, 1, 1) ~= "Q" then-- Verdien er enten "ukjent" eller "ingen"return string.format("''%s''", value)endlocal label = mw.wikibase.label( value )local sitelink = mw.wikibase.sitelink( value )return makeLink(label,sitelink,first,link)endfunction formatTimePeriod( claim, first, second )local startYear = formatYearQualifier(claim, first)  -- fra datoor formatYearQualifier(claim, 'P1319') -- tidligste datoor '' -- all fail--do return mw.dumpObject(claim.qualifiers['P1326']) endlocal startTitle = (hasQualifer(claim, first) and getQualifier(claim, first, true))or (hasQualifer(claim, 'P1319') and getQualifier(claim, 'P1319', true))or nillocal endYear = formatYearQualifier(claim, second)  -- til datoor formatYearQualifier(claim, 'P1326') -- seneste datoor '' -- all faillocal endTitle = (hasQualifer(claim, second) and getQualifier(claim, second, true))or (hasQualifer(claim, 'P1326') and getQualifier(claim, 'P1326', true))or nillocal asterix = mw.html.create( 'sup' ):wikitext( '*' )if startTitle thenlocal useFallback = (first == 'P1319') or not hasQualifer(claim, first)startYear = mw.html.create( 'span' ):attr( 'title', string.format("%s: %s", mw.wikibase.getLabel( useFallback and 'P1319' or first ), startTitle )):wikitext( startYear .. (useFallback and tostring( asterix ) or ''))endif endTitle thenlocal useFallback = (second == 'P1326') or not hasQualifer(claim, second)endYear = mw.html.create( 'span' ):attr( 'title', string.format("%s: %s", mw.wikibase.getLabel( useFallback and 'P1326' or second ), endTitle )):wikitext( endYear .. (useFallback and tostring( asterix ) or ''))endreturn string.format("(%s–%s)", tostring(startYear), tostring(endYear))endfunction formatTimePoint( claim )local pointYear = formatYearQualifier(claim, 'P585')or '' -- all faillocal pointTitle = (hasQualifer(claim, 'P585') and getQualifier(claim, 'P585', true))or nilif pointTitle thenpointYear = mw.html.create( 'span' ):attr( 'title', string.format("%s: %s", mw.wikibase.getLabel( 'P585' ), pointTitle )):wikitext( pointYear )endreturn string.format("(%s)", tostring(pointYear))endfunction formatEdit( qid, langCode, prop )if not qid thenreturn ''endlocal link = mw.ustring.format( linktarget, qid, langCode, prop )local text = '[[File:OOjs UI icon edit-ltr-progressive.svg'.. '|frameless|text-top|10px'.. '|alt=' .. mw.text.nowiki( linktext ).. '|link=' .. mw.text.nowiki( link ).. '|' .. mw.text.nowiki( linktext ).. ']]'local html = mw.html.create( 'span' ):addClass( 'wb-edithandle' )-- @todo this must be adjusted-- :attr( 'data-bridge-edit-flow', 'single-best-value' ):wikitext( text )return tostring( html )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,calcRefs,qid)local claims = getBestStatements(prop,qid)local i = 0local manglerOversettelse = falselocal formattedValues = {}for i, claim in ipairs(claims) dolocal value = getValue(claim)if value thenlocal 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 = trueformattedValue = "[[d:" .. value .. '|' .. value .. ']]  aaa'endif useCountry[prop] then--formattedValue = formattedValue .. " xxx"--local claim2 = filterByDate("P1448","P569",value,qid)--local navn = formaterClaims(claim2) --if (navn) then--formattedValue = formattedValue .. "<br />navn:  " .. loc .. navn--endif (hasQualifer(claim, 'P17') or hasQualifer(claim, 'P131')) thenlocal country = getQualifier(claim,"P17")if not country or country == "" thencountry = getQualifier(claim,"P131")endif country and country ~= '' thenformattedValue = formattedValue .. ', ' .. country.. "[[Kategori:Artikler hvor sted presiseres med kvalifikator fra Wikidata]]"endendend-- Dette er egentlig valg av en algoritme, dvs det burde skrives som et patternif hasQualifer(claim, 'P523') or hasQualifer(claim, 'P524') thenformattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P523', 'P524' )elseif hasQualifer(claim, 'P580') or hasQualifer(claim, 'P582') thenformattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P580', 'P582' )elseif hasQualifer(claim, 'P729') or hasQualifer(claim, 'P730') thenformattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P729', 'P730' )elseif hasQualifer(claim, 'P2031') or hasQualifer(claim, 'P2032') thenformattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P2031', 'P2032' )elseif hasQualifer(claim, 'P3415') or hasQualifer(claim, 'P3416') thenformattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P3415', 'P3416' )elseif hasQualifer(claim, 'P575') thenformattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P575' )elseif hasQualifer(claim, 'P585') thenformattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P585' )elseif hasQualifer(claim, 'P606') thenformattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P606' )elseif hasQualifer(claim, 'P813') thenformattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P813' )elseif hasQualifer(claim, 'P1191') thenformattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P1191' )elseif hasQualifer(claim, 'P1249') thenformattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P1249' )elseif hasQualifer(claim, 'P3999') thenformattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P3999' )elseif hasQualifer(claim, 'P1319') or hasQualifer(claim, 'P1326') thenformattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P1319', 'P1326' )endif formattedValue ~= '' thenlocal tmp = nilif  calcRefs == 'Y' and useReferences[prop]thentmp = refs.render(frame, claim.references)endtable.insert(formattedValues, formattedValue..(tmp or ''))endendendlocal resultat = table.concat(formattedValues, ", ")--local qid = mw.wikibase.getEntityIdForCurrentPage()local langCode = mw.language.getContentLanguage():getCode()if #formattedValues > 0 thenresultat = resultat .. formatEdit( qid, langCode, prop )end-- use of # to get count will fail in the futureif kollaps(#formattedValues) thenresultat = 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)endif manglerOversettelse thenresultat = resultat .. kategori(prop," mangler oversettelse]]" )--"[[Kategori:Artikler hvor " .. param .. " mangler oversettelse]]"endreturn resultatendfunction getFrameValue(frame, params)local args = frame.argsif args[1] == nil thenlocal pFrame = frame:getParent();args = pFrame.args;for k,v in pairs( frame.args ) doargs[k] = v;endend-- params kan være én enkelt verdi eller flere verdier adskilt med komma.-- F.eks. vil "religion,livssyn" sjekke både "religion" og "livssyn".for param in mw.text.gsplit( params, ',', true ) do if args[param] thenreturn mw.text.trim( args[param] ) endendreturn ""endfunction p.grenserTil(frame)assert( frame )return getFormattedValues(frame,'P47',"grenser til")endfunction p.yrker(frame)assert( frame )return getFormattedValues(frame,'P106',"beskjeftigelse", false)endfunction _strip( str )return string.sub( str, 2 , string.len( str )-1 )endfunction strip( str )local lang = mw.language.getContentLanguage()-- Fjern mest mulig formatering fra den lokale verdienlocal stripped = str:gsub("<span[^>]-wb%-edithandle[^>]*>.-</span>", ""):gsub("%[%[([^%[%]%{%}%|]+)%|([^%[%]%{%}%|]+)%]%]", "%2")stripped = stripped:gsub("%b<>", "")local last = nilrepeatlast = strippedstripped = stripped:gsub( "(%b[])", _strip ):gsub( "(%b{})", _strip ) -- not sure if this should be escaped:gsub( "(%b())", _strip )until ( last == stripped )stripped = stripped:gsub("''+", ""):gsub("^%s+", ""):gsub("%s+$", ""):gsub("(%s)%s+", "%1")stripped = lang:uc(stripped)return strippedendfunction velg(frame, prop, param, link, qid)local verdiFraFrame = getFrameValue(frame, param)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    local calcRefs = 'Y'if verdiFraFrame ~= '' then-- Hvis malargumentet er satt til en lokal verdi betyr det at det ikke er ønskelig-- at feltet vises med lokal data, selv om det finnes data på Wikidata.-- Ikke beregn referanser for at de ikke skal komme med i referanselisten-- Lag Wikidata resultatene slik at det kan sammenlignes og lages vedlikeholdkategoriercalcRefs = 'N'endlocal verdiFraWikidata = getFormattedValues(frame, prop, param, link,calcRefs,qid)if verdiFraWikidata == "" then-- No value at Wikidata.if verdiFraFrame == "" thenreturn ""endreturn verdiFraFrame .. "[[Kategori:Artikler hvor " .. param .. " mangler på Wikidata]]"endif verdiFraFrame == "" thenif verdiFraWikidata == "" thenreturn ""endreturn verdiFraWikidata .. kategori(prop, " hentes fra Wikidata]]")--"[[Kategori:Artikler hvor " .. param .. " hentes fra Wikidata]]"endif strip(verdiFraFrame) == strip(verdiFraWikidata) then-- Den lokale verdien er helt lik Wikidata-verdienreturn verdiFraWikidata -- .. "[[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]]"endfunction lagRad(value,displayName)return string.format([[<tr class="rad" valign="top"><th colspan="2" class="nowrap">%s</th><td colspan="2">%s</td></tr>]], displayName, value)endfunction rad( frame, prop, param, link, displayName, qid )assert( frame )local lang = mw.language.getContentLanguage()local verdiFraFrame = getFrameValue( frame, param )local value = velg( frame, prop, param, link, qid )displayName = displayName or lang:ucfirst(param)if verdiFraFrame == "uten" then-- I dette tilfellet har velg() returnert en kategori av typen-- [[Kategori:Artikler hvor {param} spesifisert som uten]].-- Vi sender denne videre.return valueendif value == "" thenreturn ""endreturn string.format([[<tr class="rad" valign="top"><th colspan="2" class="nowrap">%s</th><td colspan="2">%s</td></tr>]], displayName, value)endfunction p.rad(frame)assert( frame )if frame.args['ref'] thenuseReferences[frame.args['wdp']] = "frame.args['param']"end    local qid = nilif frame.args['qid'] and frame.args['qid'] ~= "" thenqid = frame.args['qid']end    return rad(frame, frame.args['wdp'], frame.args['param'], nil, frame.args['tekst'], qid)endfunction p.values(frame)assert( frame )if frame.args['ref'] thenuseReferences[frame.args['wdp']] = "frame.args['param']"endif frame.args['kollaps'] then    kollapsNum = tonumber(frame.args['kollaps'])    end    local qid = nilif frame.args['qid'] and frame.args['qid'] ~= "" thenqid = frame.args['qid']endreturn velg(frame, frame.args['wdp'], frame.args['param'], true, qid)end-- nye metoderlocal sprakNb = {["nb"] = "bokmål",}local sprakNo = {["nb"] = "",     -- bokmål["nn"] = " ([[nynorsk|nn]])",["se"] = " ([[nordsamisk|se]])",}local datoForEgenskap = {["P19"] = "P569",["P20"] = "P570",}-- todo - spesialhåndtering av varighet. Slik som for P2415-- todo - Kategorier? for mangler function fmtValue(snak)local res = nilif snak.snaktype == "value" and snak.datatype == "quantity" thenlocal value = snak.datavalue.value or nillocal q = string.match( value.unit, "Q[0-9]*")local prop = getBestStatements("P5061",q)prop = filtrerClaims(prop,sprakNo)--return "<pre>" .. mw.text.jsonEncode(prop, mw.text.JSON_PRETTY) .. "</pre>"if prop and prop[1] thenlocal label = prop[1].mainsnak.datavalue.value.textlocal sitelink = mw.wikibase.sitelink( q )local txt =  makeLink(label,sitelink,false,true)return tostring(tonumber(value.amount)) .. " " .. txtend--res = mw.wikibase.label(q)endreturn resendfunction formatUrl(url)local urltext = urllocal j1 = string.find(urltext,'//',1,true)if j1 then urltext = string.sub(urltext,j1+2,string.len(urltext)) else urltext = '' endif urltext ~= '' thenlocal i1 = string.find(urltext,'/',1,true)if i1 then urltext = string.sub(urltext,1,i1-1) endelseurltext = urlendreturn "[" .. url .. " " .. urltext .. "]"endfunction formatAsLabel(qid)return mw.wikibase.label(qid) endfunction p.formatLenke(sitelink,label)if label and sitelink thenreturn '[[' .. sitelink .. '|' .. label .. ']]'endif label and not sitelink thenreturn labelendif sitelink and not label thenreturn '[[' .. sitelink .. ']]'endreturn ''end--  Todo: Skriv omfunction formatTime(claim)-- Dette er egentlig valg av en algoritme, dvs det burde skrives som et patternlocal formattedValue = ""if hasQualifer(claim, 'P523') or hasQualifer(claim, 'P524') thenformattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P523', 'P524' )elseif hasQualifer(claim, 'P580') or hasQualifer(claim, 'P582') thenformattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P580', 'P582' )elseif hasQualifer(claim, 'P729') or hasQualifer(claim, 'P730') thenformattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P729', 'P730' )elseif hasQualifer(claim, 'P2031') or hasQualifer(claim, 'P2032') thenformattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P2031', 'P2032' )elseif hasQualifer(claim, 'P3415') or hasQualifer(claim, 'P3416') thenformattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P3415', 'P3416' )elseif hasQualifer(claim, 'P575') thenformattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P575' )elseif hasQualifer(claim, 'P585') thenformattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P585' )elseif hasQualifer(claim, 'P606') thenformattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P606' )elseif hasQualifer(claim, 'P813') thenformattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P813' )elseif hasQualifer(claim, 'P1191') thenformattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P1191' )elseif hasQualifer(claim, 'P1249') thenformattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P1249' )elseif hasQualifer(claim, 'P3999') thenformattedValue = formattedValue .. ' ' .. formatTimePoint( claim, 'P3999' )elseif hasQualifer(claim, 'P1319') or hasQualifer(claim, 'P1326') thenformattedValue = formattedValue .. ' ' .. formatTimePeriod( claim, 'P1319', 'P1326' )endreturn formattedValueendfunction p.formatSpraak(snak)assert( snak )local spraakid = snak.datavalue.value.id or nilif not spraakid thenreturn nilendlocal prop = getBestStatements("P218",spraakid) or getBestStatements("P220",spraakid) or nilif prop thenif not prop[1] thenreturn ""endif not prop[1].mainsnak thenreturn ""endlocal kortnavn = prop[1].mainsnak.datavalue.value or nillocal sitelink = mw.wikibase.sitelink( spraakid )return p.formatLenke(sitelink,kortnavn)endlocal lab = mw.wikibase.label(spraakid)return labendfunction formatQualifier(qual,pval)if qual and pval thenif true then--return dump(qual) .. dump(pval)endlocal qv = qual[pval]local snak = qv[1] or nilif snak and snak.snaktype == "value" thenif pval == "P407" thenreturn p.formatSpraak(snak)endif snak.datatype == "wikibase-item" thenreturn formatAsLabel(snak.datavalue.value.id)endif snak.datatype == "time" thenreturn ""endreturn "" --mw.wikibase.formatValues(qv)endendendfunction formatQualifiers(quals)if not quals thenreturn "" --.."(-quals)"endlocal txt = ""local sep = " ("for prop, qual in pairs(quals) dolocal qualTxt = formatQualifier(quals,prop)if qualTxt and qualTxt ~= "" thentxt = txt .. sep .. qualTxtsep = ", "endendif txt ~= "" thentxt = txt .. ")"endreturn txtendfunction filtrerElementEtterTidspunkt(qid,tid,tidsegenskaper)endfunction filtrerEtterTidspunkt(claim,tid,tidsegenskaper)local snak = claim.mainsnakif lang[snak.datavalue.value.language] thenreturn claimendreturn nilendfunction filtrerMonolingualtext(claim,lang)local snak = claim.mainsnakif lang[snak.datavalue.value.language] thenreturn claimendreturn nilendfunction filtrerClaim(claim)local snak = claim.mainsnakif snak.snaktype ~= "value" thenreturn nilendlocal datatype = snak.datatype if datatype == 'monolingualtext' thenreturn filtrerMonolingualtext(claim,sprakNo)endreturn claimendfunction filtrerClaims(claims)local resultat = {}for i, claim in ipairs(claims) dolocal filtrert = filtrerClaim(claim)if filtrert thentable.insert(resultat, filtrert)endendlog = log .. "Filtrert til: " .. #resultatreturn resultatendfunction sorterClaims(claims)local resultat = {}for i, claim in ipairs(claims) dotable.insert(resultat, claim)endreturn resultatendfunction dump(item)return "<pre>" .. mw.text.jsonEncode(item, mw.text.JSON_PRETTY) .. "</pre>"endfunction placeTooltip(qid,txt)local entity = mw.wikibase.getEntity(qid)if not entity thenreturn txtendlocal descr = {}table.insert(descr,mw.wikibase.label(qid))table.insert(descr,mw.wikibase.description(qid))txt = table.concat(descr,"; ")return mw.getCurrentFrame():expandTemplate{title="Tooltip",args = { " [*]", txt} }endfunction ref(txt)return txtendfunction placeStatus(pidStart,pidSlutt,qid,atDate,atDatePrecision)if true then--return pidStart .. " " .. pidSlutt .. " " .. qid .. " " .. dump(atDate) .. " " .. dump(atDatePrecision)endlocal etablert = getOkStatements(pidStart,qid)local startDate,startPrecision = getDatov(etablert)local cmpStart = cmpTime(atDate,atDatePrecision,startDate,startPrecision)local slutt = getOkStatements(pidSlutt,qid)local sluttDate,sluttPrecision = getDatov(slutt)local cmpSlutt = cmpTime(atDate,atDatePrecision,sluttDate,sluttPrecision)if false thenreturn "<br />Start: " .. dump(etablert) .. dump(startDate) .. " At: " .. dump(atDate) .. " cmp: " .. cmpStart.. "Slutt: " .. dump(slutt) .. dump(sluttDate) .. " cmp: " .. cmpSlutt--return " [" .. cmpStart .. " " .. cmpSlutt .. "]"endif (etablert and #etablert>0) or (slutt and #slutt>0) thenif cmpStart == 1 and cmpSlutt == 0  then  -- atdato < startdato  & ingen sluttdatoreturn ref(" [1: nåværende (før start & uten slutt)]")endif cmpStart == 1 and cmpSlutt == 1  then  -- atdato < startdato & atdato < sluttdatoreturn ref(" [2: senere (før start & før slutt)]")endif cmpStart == 1 and cmpSlutt == -1  then  -- atdato < startdato & atdato > sluttdatoreturn ref(" [3: før opprettet & etter avsluttet???]")endif cmpStart == 0 and cmpSlutt == 0  then  -- ingen startdato & ingen sluttdatoreturn ref(" [4: vanlig (ingen start & ingen slutt)]")endif cmpStart == 0 and cmpSlutt == 1  then  -- ingen startdato & atdato < sluttdatoreturn ref(" [5: daværende (ingen start & før slutt)]")endif cmpStart == 1 and cmpSlutt == -1  then  -- ingen startdato & atdato > sluttdatoreturn ref(" [6: tidligere (ingen start & etter slutt)]")endif cmpStart == -1 and cmpSlutt == 0  then  -- atdato > startdato  & ingen sluttdatoreturn ref(" [7: vanlig (etter start & uten slutt)]")endif cmpStart == -1 and cmpSlutt == 1  then  -- atdato > startdato & atdato < sluttdatoreturn ref(" [8: daværende (etter start & før slutt)]")endif cmpStart == -1 and cmpSlutt == -1  then  -- atdato > startdato & atdato > sluttdatoreturn ref(" [9: tidligere (etter start & etter slutt)]")endendreturn ""endfunction countryName(snak,qidG,atDate,atDatePrecision)local claims = getOkStatements("P17",snak.datavalue.value.id)if not claims or #claims == 0 thenreturn ""endif true then--return dump(claims)endlocal claims2 = filterClaimsByDate(claims,atDate,atDatePrecision)local country = mw.wikibase.formatValue(claims2[1].mainsnak)if claims2[1].mainsnak then--return dump(claims2[1].mainsnak)--.. claims2[1].mainsnak.datavalue.value.idendlocal txt = placeStatus("P571","P576",claims2[1].mainsnak.datavalue.value.id,atDate,atDatePrecision) .. " "--..placeStatus("P580","P582",claims2[1].mainsnak.datavalue.value.id,atDate,atDatePrecision)return country --.. " " .. .. " " .. txt--placeName(claims2[1].mainsnak,snak.datavalue.value.id,"P2561",atDate,atDatePrecision)endfunction placeAndCountry(snak,qidG,atDate,atDatePrecision)local name = placeName(snak,qidG,"P1448",atDate,atDatePrecision)local country = countryName(snak,qidG,atDate,atDatePrecision)local txt = nameif country ~= "" thentxt = txt .. ", " .. countryendreturn txtendfunction placeName(snak,qidG,pid,fdato,fprecision)log = log .. "<br /> P19 start:"--local pid = "P1448"local placeQid = snak.datavalue.value.idlocal claims = getOkStatements(pid,placeQid)--local fdate = getOkStatements("P569",qidG)--local fdato,fprecision = getDatov(fdate)--local claim = {}--claim[1] = snakif not claims or #claims == 0 thenlocal txt = placeStatus("P571","P576",placeQid,fdato,fprecision) .. " " ..placeStatus("P580","P582",placeQid,fdato,fprecision)return mw.wikibase.formatValue(snak) .. txtendlocal claims2 = filterByDate(pid,"P569",snak.datavalue.value.id,qidG)log = log .. "<br /> P19 slutt:"local sorterteClaime = sorterClaims(claims2)local formattedValues = formaterClaims(sorterteClaime)local sep = "<br/>"if kollaps(#formattedValues) thensep = "<br/>"endlocal navn = formattedValues[1]--table.concat(formattedValues, sep)local lnk = snak.datavalue.value.idlocal sitelink = mw.wikibase.sitelink( lnk )if sitelink and sitelink == "" thensitelink = nilendreturn makeLink(navn,sitelink,false,true)endlocal qidG = nilfunction formaterClaim(claim,claims)local snak = claim.mainsnaklocal qu = claim.qualifierslocal rf = claim.referenceslocal pr = snak.propertyif true then--return dump(claim.mainsnak)endlocal fmtClaim = mw.wikibase.formatValue(snak)local doFmtQual = trueif snak.snaktype ~= "value" then--refValue = datatype .. ": Ingen verdi"elselocal datatype = snak.datatype if true then--return dump(snak) .. mw.wikibase.formatValues(snak)endif datatype == 'url' then fmtClaim = formatUrl(snak.datavalue.value) local qt = formatQualifier(qu,"P407")if qt and qt ~= "" thenfmtClaim = fmtClaim .. " (" .. qt .. ")"enddoFmtQual = falseelseif datatype == 'time' thenfmtClaim = norskDatoFraClaim(snak)elseif datatype == 'monolingualtext' thenlocal txt = sprakNo[snak.datavalue.value.language]if txt thenfmtClaim = fmtClaim .. txtendelseif datatype == 'quantity' thenlocal val = fmtValue(snak)if val thenfmtClaim = valendelseif datatype == 'wikibase-item' then--fmtClaim = fmtClaim .. "<br />" .. dump(snak)if pr == "P19" or pr == "P20" thenlocal prDato = datoForEgenskap[pr]local date = getOkStatements(prDato,qidG)local dato,precision = getDatov(date)return --prDato .. " " .. dato .. " " ..placeAndCountry(snak,qidG,dato,precision)end--refValue = formatAsLabel(snak.datavalue.value.id)endendlocal formatertKval = ""if doFmtQual thenformatertKval = formatQualifiers(qu)endlocal formatertTid = formatTime(claim)fmtClaim = fmtClaim .. formatertTid .. formatertKval--local fmtClaim = mw.wikibase.formatValues(claim.mainsnak)return fmtClaimendfunction formaterClaims(claims)local formattedValues = {}for i, claim in ipairs(claims) dolocal resultat = formaterClaim(claim)if resultat thenif useReferences[claim.mainsnak.property] thenlocal ref = refs.render(mw.getCurrentFrame(), claim.references)resultat = resultat .. refendtable.insert(formattedValues, resultat)endendreturn formattedValuesendfunction getWikidataVerdi(qid,pid)local verdiListe = ""local claims = getOkStatements(pid,qid)local i = 0local manglerOversettelse = falselocal filtrerteClaims = filtrerClaims(claims)local sorterteClaims = sorterClaims(filtrerteClaims)local formattedValues = formaterClaims(sorterteClaims)local sep = "<br/>"if kollaps(#formattedValues) thensep = "<br/>"endverdiListe = table.concat(formattedValues, sep)if kollaps(#formattedValues) thenverdiListe = string.format([[<div class="mw-collapsible mw-collapsed"><div class="sentrert">%s oppføringer</div><div class="mw-collapsible-content">%s</div></div>]], #formattedValues, verdiListe)endreturn verdiListeendfunction p._verdi(frame,qid,pid,param,ref,sprak)local verdi = getFrameValue(frame, param)if verdi == "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 parameter spesifisert som uten]]"endif verdi ~= '' thenreturn verdi .. ""endif not pid or pid=="" thenreturn ""enduseReferences[pid] = "ja"if ref and ref == 'nei' thenuseReferences[pid] = nilendverdi = getWikidataVerdi(qid,pid) return verdiendfunction p._rad2(frame,qid,pid,param,ref,sprak,displayName)local verdi = p._verdi(frame,qid,pid,param,ref,sprak)if not verdi thenreturn ""endif verdi == '' thenreturn verdi .. ""end return '<tr class="rad" valign="top">' ..'<th colspan="2" class="nowrap">' ..  displayName .. '</th>' ..'<td colspan="2">' .. verdi .. '</td>' ..'</tr>' -- lagRad(verdi,displayName)endfunction p.verdi(frame)assert( frame )if frame.args['kollaps'] then    kollapsNum = tonumber(frame.args['kollaps'])    end    local qid = nilif frame.args['qid'] and frame.args['qid'] ~= "" thenqid = frame.args['qid']endqidG = qid    local pid = frame.args['pid'] or frame.args['wdp'] or nil    local ref = frame.args['ref'] or nil    local param = frame.args['param'] or "xxx"    local sprak = frame.args['språk'] or nil    local resultat = p._verdi(frame,qid,pid,param,ref,sprak)return resultatendfunction p.rad2(frame)assert( frame )if frame.args['kollaps'] then    kollapsNum = tonumber(frame.args['kollaps'])    end    local qid = nilif frame.args['qid'] and frame.args['qid'] ~= "" thenqid = frame.args['qid']end    local pid = frame.args['pid'] or frame.args['wdp'] or nil    local ref = frame.args['ref'] or nil    local param = frame.args['param'] or "xxx"    local sprak = frame.args['språk'] or nillocal lang = mw.language.getContentLanguage()local displayName = frame.args['tekst'] or lang:ucfirst(param)    local resultat = p._rad2(frame,qid,pid,param,ref,sprak,displayName)return resultatendfunction p.dump(frame)assert( frame )if frame.args['qid'] and frame.args['qid'] ~= "" thenqid = frame.args['qid']endlocal claims = getBestStatements(frame.args['wdp'],qid)--local claims = mw.wikibase.getAllStatements(frame.args['wdp'],qid)return "<pre>" .. mw.text.jsonEncode(claims, mw.text.JSON_PRETTY) .. "</pre>" endlog = ""--if snak and snak.snaktype == "value" then--if snak.datatype == "wikibase-item" then--return formatAsLabel(snak.datavalue.value.id)slutt = {}slutt[11] = 11slutt[10] = 8slutt[9]  = 5-- fungerer kun for datoer etter år null.function cmpTime(time1,precision1,time2,precision2)if not time1 or not time2 thenreturn 0endlocal prec = math.min(precision1,precision2)if not slutt[prec] thenreturn 0endlocal str2 = string.sub(time2,2,slutt[prec])local str1 = string.sub(time1,2,slutt[prec])--log = log .. date .. " " .. pr1 .. "  " .. time .. "  "  .. pr2 .. "<br/>"if str1 > str2 thenlog = log .. "cmp: " .. str1 .. " " .. str2 .. " 1<br/>"return -1endif str1 == str2 thenlog = log .. "cmp: " .. str1 .. " " .. str2 ..  " 0<br/>"return 0endif str1 < str2 thenlog = log .. "cmp: " .. str1 .. " " .. str2 ..  " -1<br/>"return 1endreturn 0endfunction cmpDate(claim,date,precision,pid)local qu = claim.qualifiersif not qu thenreturn 0enddatepid = qu[pid] or nil--local snak = datepid or nilif datepid and datepid[1].snaktype == "value" thenlocal time = datepid[1].datavalue.value.timelocal pr2 = tonumber(datepid[1].datavalue.value.precision)local pr1 = tonumber(precision)local prec = math.min(pr2,pr1)if not slutt[prec] thenreturn 0endlocal str2 = string.sub(date,2,slutt[prec])local str1 = string.sub(time,2,slutt[prec])--log = log .. date .. " " .. pr1 .. "  " .. time .. "  "  .. pr2 .. "<br/>"if str1 > str2 thenlog = log .. "cmp: " .. str1 .. " " .. str2 .. " 1<br/>"return -1endif str1 == str2 thenlog = log .. "cmp: " .. str1 .. " " .. str2 ..  " 0<br/>"return 0endif str1 < str2 thenlog = log .. "cmp: " .. str1 .. " " .. str2 ..  " -1<br/>"return 1endreturn 0endlog = log .. "novalue " .. " 0<br/>"return 0endfunction okDate(claim,date,precision,pid,mode)local cmp = cmpDate(claim,date,precision,pid)if cmp == 0 or cmp == mode thenreturn trueendreturn falseendfunction filterClaimsByDate(claims,date,precision)local claims2 = {}for i,claim in ipairs(claims) doif okDate(claim,date,precision,"P580",1) thenlog = log .. "<br />P580:" .. date .. "  -> claims2"table.insert(claims2,claim)endendlocal claims3 = {}for i,claim in ipairs(claims2) doif okDate(claim,date,precision,"P582",-1) thenlog = log .. "<br />P582:" .. date .. "  -> claims3"table.insert(claims3,claim)endendlocal claims4 = {}for i,claim in ipairs(claims3) doif okDate(claim,date,precision,"P585",0) thenlog = log .. "<br />P585:" .. date .. "  -> claims4"table.insert(claims4,claim)endendreturn claims4endfunction getDatov(claimsDate)for i, claimDate in ipairs(claimsDate) dolocal snakDate = claimDate.mainsnaklocal timestamp = snakDate.datavalue.value.timelocal presisjon = snakDate.datavalue.value.precisionreturn timestamp,presisjonendreturn "1","1"endfunction filterByDate(pid,pidDate,qid,qidDate)local claims = getOkStatements(pid,qid)log = log .. "claims:  " .. dump(claims)local claimsDate = getOkStatements(pidDate,qidDate)log = log .. "claimsDate:  " .. pidDate .. "  " .. dump(qidDate) .. dump(claimsDate)local date,precision = getDatov(claimsDate)log = log .. "date: " .. date .. "  presisjon: " .. precision .. "  qid: " .. qid .. "  pid: " .. pid .. "<br/>" local claims2 = filterClaimsByDate(claims,date,precision)-- .. "<pre>" .. mw.text.jsonEncode(claimsDate, mw.text.JSON_PRETTY) .. "</pre><br />" return claims2endfunction p.test(frame)--return aa2(frame)assert( frame )local qid,pid = "Q585","P2561"if frame.args['qid'] and frame.args['qid'] ~= "" thenqid = frame.args['qid']endif frame.args['pid'] and frame.args['pid'] ~= "" thenpid = frame.args['pid']end-- pid = "P1448"    -- offisielt navn, bruker navn da de er kortere (uten referanser bl.a)--pid = "P17"local claims = getOkStatements(pid,qid)local date,precision = "1814-11-04",11if frame.args['param'] and frame.args['param'] ~= "" thendate = frame.args['param']endif frame.args['dato'] and frame.args['dato'] ~= "" thendate = frame.args['dato']endif frame.args['presisjon'] and frame.args['presisjon'] ~= "" thenprecision = frame.args['presisjon']endlocal qiddato = nilif frame.args['qiddato'] and frame.args['qiddato'] ~= "" thenqiddato = frame.args['qiddato']endlocal piddato = nilif frame.args['piddato'] and frame.args['piddato'] ~= "" thenpiddato = frame.args['piddato']endlocal claims2 = nilif piddato thenclaims2 = filterByDate(pid,piddato,qid,qiddato)local claimsDate = getBestStatements(piddato,qiddato)date,precision = getDatov(claimsDate)endif not piddato thenclaims2 = filterClaimsByDate(claims,date,precision)endlocal sorterteClaime = sorterClaims(claims2)local formattedValues = formaterClaims(sorterteClaime)local sep = "<br/>"if kollaps(#formattedValues) thensep = "<br/>"endverdiListe = table.concat(formattedValues, sep)return --"<br/>Ny test<br/>" .. log .. "date: " .. date .. "  presisjon: " .. precision .. "  qid: " .. qid .. "  pid: " .. pid .. "<br/>" ..--"<pre>" .. mw.text.jsonEncode(claims2, mw.text.JSON_PRETTY) .. "</pre>" --.. verdiListe .. "<br/>"endfunction p.label(frame)local qid = nilif frame.args['qid'] and frame.args['qid'] ~= "" thenqid = frame.args['qid']endlocal label = mw.wikibase.label( qid )return labelendfunction p._rader(frame,defs)local lang = mw.language.getContentLanguage()local txt = ""    local qid = nilif frame.args['qid'] and frame.args['qid'] ~= "" thenqid = frame.args['qid']end for i,def in ipairs(defs) dolocal param = def["param"]local pid = def["pid"]local ref = def["ref"]local sprak = def["sprak"]local displayName = def["displayName"] or lang:ucfirst(param)if not def[1] or def[1] == "rad" thentxt = txt --.. dump(def) --.. " " .. param .. " " .. ref--.. "<nowiki>" .. p._rad2(frame,qid,pid,param,ref,sprak,displayName) --.. "<nowiki/>"endendreturn txtendfunction p.familie(frame)local defs = {{ "rad",param = 'ektefelle', pid ="P26", ref= 'ja', sprak = nil},{ param = 'foreldre', pid =nil, ref= 'ja', sprak = nil, displayName = "Foreldre" },{ param = 'partner', pid ="P451", ref= 'ja', sprak = nil, displayName = "Partner" },{ "rad",param = 'far', pid ="P22", ref= 'ja', sprak = nil, displayName = "Far" },{ param = 'mor', pid ="P25", ref= 'ja', sprak = nil, displayName = "Mor" },{ param = 'søsken', pid ="P3373", ref= 'ja', sprak = nil, displayName = "Søsken" },{ param = 'barn', pid ="P40", ref= 'ja', sprak = nil, displayName = "Barn" },}return p._rader(frame,defs)endfunction p.rader(frame)return p.familie(frame)endreturn p