Modul:WikidataDato: Forskjell mellom sideversjoner
Hopp til navigering
Hopp til søk
Beskyttelse mot feil som oppstod i artikkelen Semjon Budjonnyj |
+function p.Aar & function p.aarFraClaim |
||
| Linje 1: | Linje 1: | ||
local p = {} | 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 lang = mw.language.getContentLanguage() | ||
| Linje 5: | Linje 19: | ||
function splitTimestamp(timestamp) | function splitTimestamp(timestamp) | ||
local aar = string.sub(timestamp, 2, 5) | -- @todo following can return nil, please fix | ||
local maande = maanednavn[tonumber(string.sub(timestamp, 7, 8) | local aar = string.sub(timestamp, 2, 5) | ||
local dag = tonumber(string.sub(timestamp, 10, 11) | -- @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 = '' | local fkr = '' | ||
if string.sub(timestamp, 1, 1) == '-' then | if string.sub(timestamp, 1, 1) == '-' then | ||
| Linje 16: | Linje 33: | ||
function kalender(kal) | function kalender(kal) | ||
if | -- @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 '' | return '' | ||
end | end | ||
if | -- @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 | end | ||
return | return kal | ||
end | end | ||
local function norskDato(timestamp, presisjon) | |||
local aar,maande,dag,fkr = splitTimestamp(timestamp) | |||
function | |||
local aar,maande,dag,fkr = splitTimestamp( | |||
if presisjon == 11 then | if presisjon == 11 then | ||
utstring = | utstring = dag..' '..maande..' '..tonumber(aar)..''..fkr | ||
end | |||
utstring = | if presisjon == 10 then | ||
utstring = maande..' '..tonumber(aar)''..''..fkr | |||
utstring = | end | ||
if presisjon == 9 then | |||
utstring = tonumber(aar)..''..fkr | |||
utstring = | end | ||
if presisjon == 8 then | |||
utstring = | -- @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 | end | ||
return utstring | |||
return | |||
end | end | ||
local function norskDatoLenket(timestamp, presisjon) | |||
local aar,maande,dag,fkr = splitTimestamp(timestamp) | |||
function | |||
local aar,maande,dag,fkr = splitTimestamp( | |||
if presisjon == 11 then | if presisjon == 11 then | ||
-- @todo use mw.html.wikitext to buil this | -- @todo use mw.html.wikitext to buil this | ||
return '[['..dag..' '..maande..']] [['..tonumber(aar)..fkr..']]' | |||
end | end | ||
if presisjon == 10 then | if presisjon == 10 then | ||
html | -- @todo use mw.html.wikitext to buil this | ||
return maande..' '..tonumber(aar)..''..fkr | |||
end | end | ||
if presisjon == 9 then | if presisjon == 9 then | ||
html | -- @todo use mw.html.wikitext to buil this | ||
return '[['..tonumber(aar)..''..fkr..']]' | |||
end | end | ||
if presisjon == 8 then | if presisjon == 8 then | ||
html | -- @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 | end | ||
if presisjon == 7 then | if presisjon == 7 then | ||
html | -- @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 | end | ||
return '' | |||
return | |||
end | end | ||
| Linje 94: | Linje 106: | ||
end | end | ||
function p.okProperty( | function p.okProperty(prop) | ||
-- Sjekk at | -- Sjekk at prop finnes og inneholder det vi trenger for å lage ok norsk dato | ||
if | -- @todo use snaktype instead, then several fields are implied | ||
return | 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 | end | ||
return false | |||
end | end | ||
| Linje 115: | Linje 126: | ||
local qv,pv = frameargs(frame) | local qv,pv = frameargs(frame) | ||
local entity = mw.wikibase.getEntity(qv) | local entity = mw.wikibase.getEntity(qv) | ||
if not | if not entity then | ||
return | return | ||
end | |||
if not entity['claims'] or not entity['claims'][pv] then | |||
return | |||
end | end | ||
local prop = entity['claims'][pv] | |||
local | local i = 0 | ||
local oki = 0 | local oki = 0 | ||
for i,prop in | -- @todo use for i,prop in iprop(entity['claims'][pv]), it is more readable and more effective too | ||
if p.okProperty(prop) then | while i < #prop do | ||
local rank = prop | i = i + 1 | ||
if p.okProperty(prop[i]) then | |||
local rank = prop[i]["rank"] | |||
if rank == 'preferred' then | if rank == 'preferred' then | ||
return prop | return prop[i] | ||
end | |||
if rank == 'normal' then | |||
if oki == 0 then | if oki == 0 then | ||
oki = i | oki = i | ||
| Linje 134: | Linje 150: | ||
end | end | ||
end | end | ||
-- @todo previous comment on ipairs | |||
if oki>0 then | if oki>0 then | ||
return | return prop[oki] | ||
end | end | ||
end | end | ||
| Linje 148: | Linje 165: | ||
-- Hvis ingen preferred, er den første med normal 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 | -- Det siste er tilfeldig, men kan antas være mindre utsatt for tilfeldige endringer enn å velge den siste | ||
return | 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 | end | ||
| Linje 160: | Linje 180: | ||
-- Hvis ingen preferred, er den første med normal 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 | -- Det siste er tilfeldig, men kan antas være mindre utsatt for tilfeldige endringer enn å velge den siste | ||
return | 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 | end | ||
function p.aarFraClaim(claim) | function p.aarFraClaim(claim) | ||
local timestamp = claim.datavalue.value.time | local timestamp = claim.datavalue.value.time | ||
| Linje 216: | Linje 211: | ||
return mw.text.nowiki( p.aarFraClaim(prop.mainsnak) ) | return mw.text.nowiki( p.aarFraClaim(prop.mainsnak) ) | ||
end | end | ||
return p | return p | ||
Sideversjonen fra 9. mar. 2019 kl. 16:25
Formål
Å presentere datoer fra Wikidata.
Bruk i maler
Modulen brukes ved å legge inn en av:
{{#invoke:WikidataDato|norskDato|qv=Qxxx|pv=Pxxx}}{{#invoke:WikidataDato|norskDatoLenket|qv=Qxxx|pv=Pxxx}}
i en mal.
Bruk i moduler
local WikidataDato = require( 'Module:WikidataDato' )
local entity = mw.wikibase.getEntity()
local claim = entity.claims['Pxxx'][1].mainsnak -- Kun et eksempel! I virkeligheten må man sjekke at påstanden finnes og er gyldig.
local dato = WikidataDato.norskDatoFraClaim(claim)Eksempler
| Artikkel | I artikkel | Utenfor artikkel | resultat |
|---|---|---|---|
| Erna Solberg | {{#invoke:WikidataDato |norskDato |pv=P569}} | {{#invoke:WikidataDato |norskDato |qv=Q291644 |pv=P569}} | |
| {{#invoke:WikidataDato |norskDatoLenket |pv=P569}} | {{#invoke:WikidataDato |norskDatoLenket |qv=Q291644 |pv=P569}} | ||
| Lenin | {{#invoke:WikidataDato |norskDato |pv=P569}} | {{#invoke:WikidataDato |norskDato |qv=Q1394 |pv=P569}} | |
| {{#invoke:WikidataDato |norskDatoLenket |pv=P569}} | {{#invoke:WikidataDato |norskDatoLenket |qv=Q1394 |pv=P569}} | ||
| Platon | {{#invoke:WikidataDato |norskDato |pv=P569}} | {{#invoke:WikidataDato |norskDato |qv=Q859 |pv=P569}} | |
| {{#invoke:WikidataDato |norskDatoLenket |pv=P569}} | {{#invoke:WikidataDato |norskDatoLenket |qv=Q859 |pv=P569}} | ||
| Julien Brulé (død) | |||
| Giuseppe Corsi da Celano (født) | |||
| Sergej Kirdjapkin | |||
| Sergej Kirdjapkin | |||
| Nicole Oresme | |||
| Hiempsal I | {{#invoke:WikidataDato |norskDato |pv=P569}} | {{#invoke:WikidataDato |norskDato |qv=Q523301 |pv=P569}} |
Referanser
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