Modul:WikidataDato: Forskjell mellom sideversjoner

Fra wikisida.no
Hopp til navigering Hopp til søk
Sjekker også precision når vi regner ut dag og måned
Eksporter datofunksjonene så de kan brukes av andre moduler
Linje 45: Linje 45:
end
end


local function norskDato(timestamp, presisjon)
 
local aar,maande,dag,fkr = splitTimestamp(timestamp)
-- 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
if presisjon == 11 then
utstring = dag..' '..maande..' '..tonumber(aar)..''..fkr
utstring = dag..' '..maande..' '..tonumber(aar)..''..fkr
Linje 64: Linje 72:
utstring = math.floor((aar+99)/100) ..'. århundre'..fkr
utstring = math.floor((aar+99)/100) ..'. århundre'..fkr
end
end
return utstring
 
return utstring .. kalender(value.calendarmodel)
end
end


local function norskDatoLenket(timestamp, presisjon)
-- Denne funksjonen formaterer en norsk dato fra en Wikidata-påstand
local aar,maande,dag,fkr =  splitTimestamp(timestamp)
-- (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 utstring = ''
 
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..']]'
utstring = '[['..dag..' '..maande..']] [['..tonumber(aar)..fkr..']]'
end
end
if presisjon == 10 then
if presisjon == 10 then
-- @todo use mw.html.wikitext to buil this
-- @todo use mw.html.wikitext to buil this
return maande..' '..tonumber(aar)..''..fkr
utstring = maande..' '..tonumber(aar)..''..fkr
end
end
if presisjon == 9 then
if presisjon == 9 then
-- @todo use mw.html.wikitext to buil this
-- @todo use mw.html.wikitext to buil this
return '[['..tonumber(aar)..''..fkr..']]'
utstring = '[['..tonumber(aar)..''..fkr..']]'
end
end
if presisjon == 8 then
if presisjon == 8 then
-- @todo following can return nil, please fix
-- @todo following can return nil, please fix
-- @todo use mw.html.wikitext to buil this
-- @todo use mw.html.wikitext to buil this
return '[['..tonumber(string.sub(aar, 1, 3))..'0-årene'..fkr..']]'
utstring = '[['..tonumber(string.sub(aar, 1, 3))..'0-årene'..fkr..']]'
end
end
if presisjon == 7 then
if presisjon == 7 then
-- @todo following can return nil, please fix
-- @todo following can return nil, please fix
-- @todo use mw.html.wikitext to buil this
-- @todo use mw.html.wikitext to buil this
return '[['..math.floor((aar+99)/100) ..'. århundre'..fkr..']]'
utstring = '[['..math.floor((aar+99)/100) ..'. århundre'..fkr..']]'
end
end
return ''
 
-- @todo use mw.text.nowiki, ie. this is without html
return utstring .. kalender(value.calendarmodel)
end
end


Linje 165: Linje 183:
-- 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
local presisjon = prop['mainsnak']["datavalue"]["value"]["precision"]
return p.norskDatoLenketFraClaim(prop.mainsnak)
local timestamp = prop['mainsnak']["datavalue"]["value"]["time"]
local kal = prop['mainsnak']["datavalue"]["value"]["calendarmodel"]
return norskDatoLenket(timestamp, presisjon)
end
end


Linje 180: Linje 195:
-- 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
local presisjon = prop['mainsnak']["datavalue"]["value"]["precision"]
return p.norskDatoFraClaim(prop.mainsnak)
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.dagOgMaaned (frame)
-- Denne funksjonen formaterer en norsk dato fra en Wikidata-påstand
-- (enten en "mainsnak" eller en "qualifier"). Funksjonen eksporteres
local prop = p.finnBesteProperty(frame)
-- slik at den kan brukes av andre moduler.
if not prop then
function p.dagOgMaanedFraClaim(claim)
return ''
local timestamp = claim.datavalue.value.time
end
local presisjon = claim.datavalue.value.precision
 
local timestamp = prop['mainsnak']['datavalue']['value']['time']
local presisjon = prop['mainsnak']['datavalue']['value']['precision']
if tonumber(presisjon) < 11 then
if tonumber(presisjon) < 11 then
return ''
return ''
end
end
local aar, maaned, dag
local aar, maaned, dag
aar, maaned, dag = splitTimestamp(timestamp)
aar, maaned, dag = splitTimestamp(timestamp)
if dag ~= nil and maaned ~= nil then
if dag ~= nil and maaned ~= nil then
return dag .. ' ' .. maaned
return dag .. ' ' .. maaned
Linje 209: Linje 214:
return ''
return ''
end
end
end
end


function p.Aar(frame)
function p.dagOgMaaned (frame)
local prop = p.finnBesteProperty(frame)
local prop = p.finnBesteProperty(frame)
if not prop then
if not prop then
return ''
return ''
end
end
return p.dagOgMaanedFraClaim(prop.mainsnak)
end


local timestamp = prop['mainsnak']['datavalue']['value']['time']
-- Denne funksjonen formaterer en norsk dato fra en Wikidata-påstand
local presisjon = prop['mainsnak']['datavalue']['value']['precision']
-- (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 = claim.datavalue.value.precision
if tonumber(presisjon) < 9 then
if tonumber(presisjon) < 9 then
return ''
return ''
end
end
local aar, maaned, dag, fkr
local aar, maaned, dag, fkr
aar, maaned, dag, fkr = splitTimestamp(timestamp)
aar, maaned, dag, fkr = splitTimestamp(timestamp)
if aar ~= nil and fkr ~= ' f.Kr.' then
if aar ~= nil and fkr ~= ' f.Kr.' then
return string.format('%u', aar)
return string.format('%u', aar)
Linje 236: Linje 242:
return ''
return ''
end
end
end
function p.Aar(frame)
local prop = p.finnBesteProperty(frame)
if not prop then
return ''
end
return p.aarFraClaim(prop.mainsnak)
end
end




return p
return p

Sideversjonen fra 1. nov. 2017 kl. 14:38

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


-- 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 = 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-årene'..fkr
	end
	if presisjon == 7 then
	-- @todo following can return nil, please fix
		utstring = math.floor((aar+99)/100) ..'. århundre'..fkr
	end

	return 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 utstring = ''

	if presisjon == 11 then
		-- @todo use mw.html.wikitext to buil this
		utstring = '[['..dag..' '..maande..']] [['..tonumber(aar)..fkr..']]'
	end
	if presisjon == 10 then
		-- @todo use mw.html.wikitext to buil this
		utstring = maande..' '..tonumber(aar)..''..fkr
	end
	if presisjon == 9 then
		-- @todo use mw.html.wikitext to buil this
		utstring = '[['..tonumber(aar)..''..fkr..']]'
	end
	if presisjon == 8 then
	-- @todo following can return nil, please fix
		-- @todo use mw.html.wikitext to buil this
		utstring = '[['..tonumber(string.sub(aar, 1, 3))..'0-årene'..fkr..']]'
	end
	if presisjon == 7 then
	-- @todo following can return nil, please fix
		-- @todo use mw.html.wikitext to buil this
		utstring = '[['..math.floor((aar+99)/100) ..'. århundre'..fkr..']]'
	end

	-- @todo use mw.text.nowiki, ie. this is without html
	return utstring .. 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(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
	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 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 = claim.datavalue.value.precision
	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 string.format('%u', aar)
	elseif aar ~= nil and fkr == ' f.Kr.' then
		return 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 p.aarFraClaim(prop.mainsnak)
end


return p