|
|
| Linje 1: |
Linje 1: |
| local p = {}
| |
|
| |
|
| local lang = mw.language.getContentLanguage()
| |
| local maanednavn = {'januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'}
| |
|
| |
| function splitTimestamp(timestamp)
| |
| local aar = string.sub(timestamp, 2, 5) or '????'
| |
| local maande = maanednavn[tonumber(string.sub(timestamp, 7, 8) or '00')] or '??'
| |
| local dag = tonumber(string.sub(timestamp, 10, 11) or '??')..'.'
| |
| local fkr = ''
| |
| if string.sub(timestamp, 1, 1) == '-' then
| |
| fkr = ' f.Kr.'
| |
| end
| |
| return aar,maande,dag,fkr
| |
| end
| |
|
| |
| function kalender(kal)
| |
| if string.match (kal, 'wikidata.org/entity/Q1985727$' ) then
| |
| return ''
| |
| end
| |
| if string.match (kal, 'wikidata.org/entity/Q1985786$' ) then
| |
| local html = mw.html.create( 'span' )
| |
| :wikitext( '[[Den julianske kalenderen|juliansk]]' )
| |
| return ' ('..tostring( html )..')'
| |
| end
| |
| return mw.text.nowiki( kal )
| |
| end
| |
|
| |
|
| |
| -- Denne funksjonen formaterer en norsk dato fra en Wikidata-påstand
| |
| -- (enten en "mainsnak" eller en "qualifier"). Funksjonen eksporteres
| |
| -- slik at den kan brukes av andre moduler.
| |
| function p.norskDatoFraClaim(claim)
| |
| local value = claim.datavalue.value
| |
| local presisjon = value.precision
| |
| local aar,maande,dag,fkr = splitTimestamp(value.time)
| |
| local utstring = ''
| |
|
| |
| if presisjon == 11 then
| |
| utstring = string.format( '%s %s %s%s', dag, maande, tonumber(aar) or aar, fkr )
| |
| elseif presisjon == 10 then
| |
| utstring = string.format( '%s %s%s', maande, tonumber(aar) or aar, fkr )
| |
| elseif presisjon == 9 then
| |
| utstring = (tonumber(aar) or aar)..''..fkr
| |
| utstring = string.format( '%s%s', tonumber(aar) or aar, fkr )
| |
| elseif presisjon == 8 then
| |
| utstring = string.format( '%s-årene%s', tonumber(string.sub(aar, 1, -1)..'0'), fkr )
| |
| elseif presisjon == 7 then
| |
| utstring = string.format( '%s. århundre%s', math.floor(((tonumber(aar) or 0)+99)/100), fkr )
| |
| end
| |
|
| |
| return mw.text.nowiki( utstring ).. kalender(value.calendarmodel)
| |
| end
| |
|
| |
| -- Denne funksjonen formaterer en norsk dato fra en Wikidata-påstand
| |
| -- (enten en "mainsnak" eller en "qualifier"). Funksjonen eksporteres
| |
| -- slik at den kan brukes av andre moduler.
| |
| function p.norskDatoLenketFraClaim(claim)
| |
| local value = claim.datavalue.value
| |
| local presisjon = value.precision
| |
| local aar,maande,dag,fkr = splitTimestamp(value.time)
| |
| local html = mw.html.create( 'span' )
| |
|
| |
| if presisjon == 11 then
| |
| -- @todo use mw.html.wikitext to buil this
| |
| html:wikitext( string.format( '[[%s %s]] [[%s%s]]', dag, maande, tonumber(aar) or aar, fkr ) )
| |
| end
| |
| if presisjon == 10 then
| |
| html:wikitext( string.format( '[[%s]] [[%s%s]]', maande, tonumber(aar) or aar, fkr ) )
| |
| end
| |
| if presisjon == 9 then
| |
| html:wikitext( string.format( '[[%s%s]]', tonumber(aar) or aar, fkr ) )
| |
| end
| |
| if presisjon == 8 then
| |
| html:wikitext( string.format( '[[%s-årene%s]]', math.floor(((tonumber(aar) or 0))/10)*10, fkr ) )
| |
| end
| |
| if presisjon == 7 then
| |
| html:wikitext( string.format( '[[%s. århundre%s]]', math.floor(((tonumber(aar) or 0)+99)/100), fkr ) )
| |
| end
| |
|
| |
| return tostring(html) .. kalender(value.calendarmodel)
| |
| end
| |
|
| |
| local function frameargs(frame)
| |
| 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
| |
| return args['qv'],args['pv']
| |
| end
| |
|
| |
| function p.okProperty( claim )
| |
| -- Sjekk at claim finnes og inneholder det vi trenger for å lage ok norsk dato
| |
| if not claim and claim.type ~= 'statement' then
| |
| return nil
| |
| end
| |
|
| |
| local mainsnak = claim.mainsnak or {}
| |
|
| |
| if mainsnak.snaktype ~= 'value' or mainsnak.datatype ~= 'time' then
| |
| return nil
| |
| end
| |
|
| |
| local datavalue = mainsnak.datavalue or {}
| |
| local value = datavalue.value or {}
| |
|
| |
| return not not (value.time and value.precision and value.calendarmodel)
| |
| end
| |
|
| |
| function p.finnBesteProperty(frame)
| |
| local qv,pv = frameargs(frame)
| |
| local entity = mw.wikibase.getEntity(qv)
| |
| if not ( entity and entity.claims and entity.claims[pv] ) then
| |
| return nil
| |
| end
| |
|
| |
| local props = entity['claims'][pv]
| |
|
| |
| local oki = 0
| |
| for i,prop in ipairs(props) do
| |
| if p.okProperty(prop) then
| |
| local rank = prop.rank or 'normal'
| |
| if rank == 'preferred' then
| |
| return prop
| |
| elseif rank == 'normal' then
| |
| if oki == 0 then
| |
| oki = i
| |
| end
| |
| end
| |
| end
| |
| end
| |
| if oki>0 then
| |
| return props[oki]
| |
| end
| |
| end
| |
|
| |
| function p.norskDatoLenket(frame)
| |
| local prop = p.finnBesteProperty(frame)
| |
| if not prop then
| |
| return ""
| |
| end
| |
| -- prop er nå en ok property.
| |
| -- Hvis det finnes en med rank preferred er den valgt
| |
| -- Hvis ingen preferred, er den første med normal valgt.
| |
| -- Det siste er tilfeldig, men kan antas være mindre utsatt for tilfeldige endringer enn å velge den siste
| |
| return p.norskDatoLenketFraClaim(prop.mainsnak)
| |
| end
| |
|
| |
| function p.norskDato(frame)
| |
| local prop = p.finnBesteProperty(frame)
| |
| if not prop then
| |
| return ""
| |
| end
| |
| -- prop er nå en ok property.
| |
| -- Hvis det finnes en med rank preferred er den valgt
| |
| -- Hvis ingen preferred, er den første med normal valgt.
| |
| -- Det siste er tilfeldig, men kan antas være mindre utsatt for tilfeldige endringer enn å velge den siste
| |
| return p.norskDatoFraClaim(prop.mainsnak)
| |
| end
| |
|
| |
| -- Denne funksjonen formaterer en norsk dato fra en Wikidata-påstand
| |
| -- (enten en "mainsnak" eller en "qualifier"). Funksjonen eksporteres
| |
| -- slik at den kan brukes av andre moduler.
| |
| function p.dagOgMaanedFraClaim(claim)
| |
| local timestamp = claim.datavalue.value.time
| |
| local presisjon = claim.datavalue.value.precision
| |
| if tonumber(presisjon) < 11 then
| |
| return ''
| |
| end
| |
| local aar, maaned, dag
| |
| aar, maaned, dag = splitTimestamp(timestamp)
| |
| if dag ~= nil and maaned ~= nil then
| |
| return mw.text.nowiki( dag .. ' ' .. maaned )
| |
| else
| |
| return ''
| |
| end
| |
| end
| |
|
| |
| function p.dagOgMaaned (frame)
| |
| local prop = p.finnBesteProperty(frame)
| |
| if not prop then
| |
| return ''
| |
| end
| |
| return p.dagOgMaanedFraClaim(prop.mainsnak)
| |
| end
| |
|
| |
| -- Denne funksjonen formaterer en norsk dato fra en Wikidata-påstand
| |
| -- (enten en "mainsnak" eller en "qualifier"). Funksjonen eksporteres
| |
| -- slik at den kan brukes av andre moduler.
| |
| function p.aarFraClaim(claim)
| |
| local timestamp = claim.datavalue.value.time
| |
| local presisjon = tonumber(claim.datavalue.value.precision) or 0
| |
| if tonumber(presisjon) < 9 then
| |
| return ''
| |
| end
| |
| local aar, maaned, dag, fkr
| |
| aar, maaned, dag, fkr = splitTimestamp(timestamp)
| |
| if aar ~= nil and fkr ~= ' f.Kr.' then
| |
| return mw.text.nowiki( string.format('%u', aar) )
| |
| elseif aar ~= nil and fkr == ' f.Kr.' then
| |
| return mw.text.nowiki( string.format('%u', aar) .. ' f.Kr.' )
| |
| else
| |
| return ''
| |
| end
| |
| end
| |
|
| |
| function p.Aar(frame)
| |
| local prop = p.finnBesteProperty(frame)
| |
| if not prop then
| |
| return ''
| |
| end
| |
| return mw.text.nowiki( p.aarFraClaim(prop.mainsnak) )
| |
| end
| |
|
| |
|
| |
| return p
| |