Modul:WikidataDato: Forskjell mellom sideversjoner

Fra Wikisida.no
Hopp til navigering Hopp til søk
(Kun referanser når dato er lenket)
(Kommenterer ut juliansk dato. Kun når datoen er etter oktober 1582 bør juliansk skrives ut. Alle datoer før dette blir regnet for å være julianske uansett.)
Linje 21: Linje 21:
end
end
if string.match (kal, 'wikidata.org/entity/Q1985786$' ) then
if string.match (kal, 'wikidata.org/entity/Q1985786$' ) then
--Kun når datoen er etter oktober 1582 bør juliansk skrives ut. Alle datoer før dette blir regnet for å være julianske uansett.
local html = mw.html.create( 'span' )
-- local html = mw.html.create( 'span' )
:wikitext( '[[Den julianske kalenderen|juliansk]]' )
-- :wikitext( '[[Den julianske kalenderen|juliansk]]' )
return ' ('..tostring( html )..')'
return --' ('..tostring( html )..')'
end
end
return mw.text.nowiki( kal )
return mw.text.nowiki( kal )

Sideversjonen fra 31. aug. 2019 kl. 19:15

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}} Lua-feil i package.lua, linje 80: module 'Module:References' not found.
{{#invoke:WikidataDato |norskDatoLenket |pv=P569}} {{#invoke:WikidataDato |norskDatoLenket |qv=Q291644 |pv=P569}} Lua-feil i package.lua, linje 80: module 'Module:References' not found.
Lenin {{#invoke:WikidataDato |norskDato |pv=P569}} {{#invoke:WikidataDato |norskDato |qv=Q1394 |pv=P569}} Lua-feil i package.lua, linje 80: module 'Module:References' not found.
{{#invoke:WikidataDato |norskDatoLenket |pv=P569}} {{#invoke:WikidataDato |norskDatoLenket |qv=Q1394 |pv=P569}} Lua-feil i package.lua, linje 80: module 'Module:References' not found.
Platon {{#invoke:WikidataDato |norskDato |pv=P569}} {{#invoke:WikidataDato |norskDato |qv=Q859 |pv=P569}} Lua-feil i package.lua, linje 80: module 'Module:References' not found.
{{#invoke:WikidataDato |norskDatoLenket |pv=P569}} {{#invoke:WikidataDato |norskDatoLenket |qv=Q859 |pv=P569}} Lua-feil i package.lua, linje 80: module 'Module:References' not found.
Julien Brulé (død) Lua-feil i package.lua, linje 80: module 'Module:References' not found.
Giuseppe Corsi da Celano (født) Lua-feil i package.lua, linje 80: module 'Module:References' not found.
Sergej Kirdjapkin Lua-feil i package.lua, linje 80: module 'Module:References' not found.
Sergej Kirdjapkin Lua-feil i package.lua, linje 80: module 'Module:References' not found.
Nicole Oresme Lua-feil i package.lua, linje 80: module 'Module:References' not found.
Hiempsal I {{#invoke:WikidataDato |norskDato |pv=P569}} {{#invoke:WikidataDato |norskDato |qv=Q523301 |pv=P569}} Lua-feil i package.lua, linje 80: module 'Module:References' not found.

Referanser



local p = {}
local refs = require 'Module:References'

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
--Kun når datoen er etter oktober 1582 bør juliansk skrives ut. Alle datoer før dette blir regnet for å være julianske uansett.
--		local html = mw.html.create( 'span' )
--			:wikitext( '[[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( '[[%s %s]] [[%s%s]]', dag, maande, tonumber(aar) or aar, fkr ) )
	end
	if presisjon == 10 then
		html:wikitext( string.format( '[[%s]] [[%s%s]]', maande, tonumber(aar) or aar, fkr ) )
	end
	if presisjon == 9 then
		html:wikitext( string.format( '[[%s%s]]', tonumber(aar) or aar, fkr ) )
	end
	if presisjon == 8 then
		html:wikitext( string.format( '[[%s-årene%s]]', math.floor(((tonumber(aar) or 0))/10)*10, fkr ) )
	end
	if presisjon == 7 then
		html:wikitext( string.format( '[[%s. århundre%s]]', 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.standardRefFormat(frame, prop)
	local found = false
	local hits = 0
	local refs = ''
	for i,v in ipairs( prop.references or {} ) do
		if v.snaks and not v.snaks.P143 then
			found = found or true
			hits = hits + 1
			-- hash will merge similar entries
			refs = refs .. frame:extensionTag( 'ref', mw.wikibase.formatValues( v.snaks ), { name = v.hash } )
		end
	end
	local nums = { 'Én', 'To', 'Tre', 'Fire', 'Fem', 'Seks', 'Syv', 'Åtte', 'Ni', 'Ti', 'Elleve', 'Tolv' }
	local cats = (found and ('[['..'Category:'..'Referanse fra Lua'..']]') or '')
	if hits == 0 then
		-- nop
	elseif hits == 1 then
		cats = cats .. ('[['..'Category:'..nums[hits] ..' referanse fra Lua'..']]')
	elseif hits <= 12 then
		cats = cats .. ('[['..'Category:'..nums[hits] ..' referanser fra Lua'..']]')
	else 
		cats = cats .. ('[['..'Category:'..'Mange referanser fra Lua'..']]')
	end
	return refs .. cats
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
	-- ulenket, minimerer overlenking
	return p.norskDatoLenketFraClaim(prop.mainsnak) .. refs.render(frame, prop.references) --p.standardRefFormat(frame, prop)
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
	-- ulenket, minimerer overlenking
	return p.norskDatoFraClaim(prop.mainsnak) -- .. refs.render(frame, prop.references) --p.standardRefFormat(frame, prop)
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