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)
-- 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.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


-- Denne funksjonen formaterer en norsk dato fra en Wikidata-påstand
local function norskDatoLenket(timestamp, presisjon)
-- (enten en "mainsnak" eller en "qualifier"). Funksjonen eksporteres
local aar,maande,dag,fkr = splitTimestamp(timestamp)
-- 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
return p.norskDatoLenketFraClaim(prop.mainsnak)
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 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
return p.norskDatoFraClaim(prop.mainsnak)
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


-- Denne funksjonen formaterer en norsk dato fra en Wikidata-påstand
function p.dagOgMaaned (frame)
-- (enten en "mainsnak" eller en "qualifier"). Funksjonen eksporteres
-- slik at den kan brukes av andre moduler.
local prop = p.finnBesteProperty(frame)
function p.dagOgMaanedFraClaim(claim)
if not prop then
local timestamp = claim.datavalue.value.time
return ''
local presisjon = claim.datavalue.value.precision
end

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


-- Denne funksjonen formaterer en norsk dato fra en Wikidata-påstand
local timestamp = prop['mainsnak']['datavalue']['value']['time']
-- (enten en "mainsnak" eller en "qualifier"). Funksjonen eksporteres
local presisjon = prop['mainsnak']['datavalue']['value']['precision']
-- 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



Sideversjonen fra 1. nov. 2017 kl. 16: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