Hopp til innhold

Modul:WikidataDato

Fra Wikikilden

Formål

[rediger]

Å presentere datoer fra Wikidata.

Bruk

[rediger]

Modulen brukes ved å legge inn en av:

{{#invoke:WikidataDato|norskDato|qv=Qxxx|pv=Pxxx}}
{{#invoke:WikidataDato|norskDatoLenket|qv=Qxxx|pv=Pxxx}}

i en mal.

Eksempler

[rediger]
Artikkel I artikkel Utenfor artikkel resultat
Erna Solberg {{#invoke:WikidataDato |norskDato |pv=P569}} {{#invoke:WikidataDato |norskDato |qv=Q291644 |pv=P569}} 24. februar 1961
{{#invoke:WikidataDato |norskDatoLenket |pv=P569}} {{#invoke:WikidataDato |norskDatoLenket |qv=Q291644 |pv=P569}} 24. februar 1961
Lenin {{#invoke:WikidataDato |norskDato |pv=P569}} {{#invoke:WikidataDato |norskDato |qv=Q1394 |pv=P569}} 22. april 1870
{{#invoke:WikidataDato |norskDatoLenket |pv=P569}} {{#invoke:WikidataDato |norskDatoLenket |qv=Q1394 |pv=P569}} 22. april 1870
Platon {{#invoke:WikidataDato |norskDato |pv=P569}} {{#invoke:WikidataDato |norskDato |qv=Q859 |pv=P569}} 4280-årene f.Kr. (juliansk)
{{#invoke:WikidataDato |norskDatoLenket |pv=P569}} {{#invoke:WikidataDato |norskDatoLenket |qv=Q859 |pv=P569}} 420-årene f.Kr. (juliansk)
Julien Brulé (død) 20. århundre
Giuseppe Corsi da Celano (født) 1631
Sergej Kirdjapkin 16. januar 1980
Sergej Kirdjapkin 16. januar 1980
Nicole Oresme 1320 (juliansk)
Hiempsal I {{#invoke:WikidataDato |norskDato |pv=P569}} {{#invoke:WikidataDato |norskDato |qv=Q523301 |pv=P569}} 2. århundre f.Kr.

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( '[[w: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( '[[w:%s %s|%s %s]] [[w:%s%s|%s%s]]', dag, maande, dag, maande, tonumber(aar) or aar, fkr, tonumber(aar) or aar, fkr ) )
	end
	if presisjon == 10 then
		html:wikitext( string.format( '[[w:%s|%s]] [[w:%s%s|%s%s]]', maande, maande, tonumber(aar) or aar, fkr, tonumber(aar) or aar, fkr ) )
	end
	if presisjon == 9 then
		html:wikitext( string.format( '[[w:%s%s|%s%s]]', tonumber(aar) or aar, fkr, tonumber(aar) or aar, fkr ) )
	end
	if presisjon == 8 then
		html:wikitext( string.format( '[[w:%s-årene%s|%s-årene%s]]', math.floor(((tonumber(aar) or 0))/10)*10, fkr, math.floor(((tonumber(aar) or 0))/10)*10, fkr ) )
	end
	if presisjon == 7 then
		html:wikitext( string.format( '[[w:%s. århundre%s|%s. århundre%s]]', math.floor(((tonumber(aar) or 0)+99)/100), fkr, 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