|
|
| Linje 1: |
Linje 1: |
| local p = {}
| |
|
| |
|
| -- @todo remove this and use mw.dumpObject instead
| |
| 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
| |
|
| |
| local lang = mw.language.getContentLanguage()
| |
| local maanednavn = {'januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'}
| |
|
| |
| function splitTimestamp(timestamp)
| |
| -- @todo following can return nil, please fix
| |
| local aar = string.sub(timestamp, 2, 5)
| |
| -- @todo following can return nil, please fix
| |
| local maande = maanednavn[tonumber(string.sub(timestamp, 7, 8))]
| |
| -- @todo following can return nil, please fix
| |
| local dag = tonumber(string.sub(timestamp, 10, 11))..'.'
| |
| local fkr = ''
| |
| if string.sub(timestamp, 1, 1) == '-' then
| |
| fkr = ' f.Kr.'
| |
| end
| |
| return aar,maande,dag,fkr
| |
| end
| |
|
| |
| function kalender(kal)
| |
| -- @todo Please use a regex and test on 'wikidata.org/entity/Q1985727$' in lack of a better parsing of referred resource
| |
| if kal == 'http://www.wikidata.org/entity/Q1985727' then
| |
| return ''
| |
| end
| |
| -- @todo Please use a regex and test on 'wikidata.org/entity/Q1985786' in lack of a better parsing of referred resource
| |
| if kal == 'http://www.wikidata.org/entity/Q1985786' then
| |
| -- @todo please use uri lib or html, prefer the later and use wikitext
| |
| return ' ([[Den julianske kalenderen|juliansk]])'
| |
| end
| |
| return kal
| |
| end
| |
|
| |
| local function norskDato(timestamp, presisjon)
| |
| local aar,maande,dag,fkr = splitTimestamp(timestamp)
| |
| if presisjon == 11 then
| |
| utstring = dag..' '..maande..' '..tonumber(aar)..''..fkr
| |
| end
| |
| if presisjon == 10 then
| |
| utstring = maande..' '..tonumber(aar)''..''..fkr
| |
| end
| |
| if presisjon == 9 then
| |
| utstring = tonumber(aar)..''..fkr
| |
| end
| |
| if presisjon == 8 then
| |
| -- @todo following can return nil, please fix
| |
| utstring = tonumber(string.sub(aar, 1, 3))..'0-åra'..fkr
| |
| end
| |
| if presisjon == 7 then
| |
| -- @todo following can return nil, please fix
| |
| utstring = math.floor((aar+99)/100) ..'. hundreåret'..fkr
| |
| end
| |
| return utstring
| |
| end
| |
|
| |
| local function norskDatoLenket(timestamp, presisjon)
| |
| local aar,maande,dag,fkr = splitTimestamp(timestamp)
| |
| if presisjon == 11 then
| |
| -- @todo use mw.html.wikitext to buil this
| |
| return '[['..dag..' '..maande..']] [['..tonumber(aar)..fkr..']]'
| |
| end
| |
| if presisjon == 10 then
| |
| -- @todo use mw.html.wikitext to buil this
| |
| return maande..' '..tonumber(aar)..''..fkr
| |
| end
| |
| if presisjon == 9 then
| |
| -- @todo use mw.html.wikitext to buil this
| |
| return '[['..tonumber(aar)..''..fkr..']]'
| |
| end
| |
| if presisjon == 8 then
| |
| -- @todo following can return nil, please fix
| |
| -- @todo use mw.html.wikitext to buil this
| |
| return '[['..tonumber(string.sub(aar, 1, 3))..'0-åra'..fkr..']]'
| |
| end
| |
| if presisjon == 7 then
| |
| -- @todo following can return nil, please fix
| |
| -- @todo use mw.html.wikitext to buil this
| |
| return '[['..math.floor((aar+99)/100) ..'. hundreåret'..fkr..']]'
| |
| end
| |
| return ''
| |
| 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(prop)
| |
| -- Sjekk at prop finnes og inneholder det vi trenger for å lage ok norsk dato
| |
| -- @todo use snaktype instead, then several fields are implied
| |
| if prop
| |
| and prop['mainsnak']
| |
| and prop["rank"]
| |
| and prop['mainsnak']["datavalue"]
| |
| and prop['mainsnak']["datavalue"]["value"]
| |
| and prop['mainsnak']["datavalue"]["value"]['time']
| |
| and prop['mainsnak']["datavalue"]["value"]['precision']
| |
| and prop['mainsnak']["datavalue"]["value"]['calendarmodel']
| |
| then
| |
| return true
| |
| end
| |
| return false
| |
| end
| |
|
| |
| function p.finnBesteProperty(frame)
| |
| local qv,pv = frameargs(frame)
| |
| local entity = mw.wikibase.getEntity(qv)
| |
| if not entity then
| |
| return
| |
| end
| |
| if not entity['claims'] or not entity['claims'][pv] then
| |
| return
| |
| end
| |
| local prop = entity['claims'][pv]
| |
| local i = 0
| |
| local oki = 0
| |
| -- @todo use for i,prop in iprop(entity['claims'][pv]), it is more readable and more effective too
| |
| while i < #prop do
| |
| i = i + 1
| |
| if p.okProperty(prop[i]) then
| |
| local rank = prop[i]["rank"]
| |
| if rank == 'preferred' then
| |
| return prop[i]
| |
| end
| |
| if rank == 'normal' then
| |
| if oki == 0 then
| |
| oki = i
| |
| end
| |
| end
| |
| end
| |
| end
| |
| -- @todo previous comment on ipairs
| |
| if oki>0 then
| |
| return prop[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
| |
| local presisjon = prop['mainsnak']["datavalue"]["value"]["precision"]
| |
| local timestamp = prop['mainsnak']["datavalue"]["value"]["time"]
| |
| local kal = prop['mainsnak']["datavalue"]["value"]["calendarmodel"]
| |
| return norskDatoLenket(timestamp, presisjon)
| |
| 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
| |
| local presisjon = prop['mainsnak']["datavalue"]["value"]["precision"]
| |
| local timestamp = prop['mainsnak']["datavalue"]["value"]["time"]
| |
| local kal = prop['mainsnak']["datavalue"]["value"]["calendarmodel"]
| |
| -- @todo use mw.text.nowiki, ie. this is without html
| |
| return norskDato(timestamp, presisjon) .. kalender(kal)
| |
| end
| |
|
| |
| 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
| |