Modul:WikidataDato: Forskjell mellom sideversjoner

Fra wikisida.no
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) or '????'
-- @todo following can return nil, please fix
local maande = maanednavn[tonumber(string.sub(timestamp, 7, 8) or '00')] or '??'
local aar = string.sub(timestamp, 2, 5)
local dag = tonumber(string.sub(timestamp, 10, 11) or '??')..'.'
-- @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 string.match (kal, 'wikidata.org/entity/Q1985727$' ) then
-- @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 string.match (kal, 'wikidata.org/entity/Q1985786$' ) then
-- @todo Please use a regex and test on 'wikidata.org/entity/Q1985786' in lack of a better parsing of referred resource
local html = mw.html.create( 'span' )
if kal == 'http://www.wikidata.org/entity/Q1985786' then
:wikitext( '[[Den julianske kalenderen|juliansk]]' )
-- @todo please use uri lib or html, prefer the later and use wikitext
return ' ('..tostring( html )..')'
return ' ([[Den julianske kalenderen|juliansk]])'
end
end
return mw.text.nowiki( kal )
return kal
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 = string.format( '%s %s %s%s', dag, maande, tonumber(aar) or aar, fkr )
utstring = dag..' '..maande..' '..tonumber(aar)..''..fkr
elseif presisjon == 10 then
end
utstring = string.format( '%s %s%s', maande, tonumber(aar) or aar, fkr )
if presisjon == 10 then
elseif presisjon == 9 then
utstring = maande..' '..tonumber(aar)''..''..fkr
utstring = (tonumber(aar) or aar)..''..fkr
end
utstring = string.format( '%s%s', tonumber(aar) or aar, fkr )
if presisjon == 9 then
elseif presisjon == 8 then
utstring = tonumber(aar)..''..fkr
utstring = string.format( '%s-årene%s', tonumber(string.sub(aar, 1, -1)..'0'), fkr )
end
elseif presisjon == 7 then
if presisjon == 8 then
utstring = string.format( '%s. århundre%s', math.floor(((tonumber(aar) or 0)+99)/100), fkr )
-- @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 mw.text.nowiki( 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 html = mw.html.create( 'span' )
 
if presisjon == 11 then
if presisjon == 11 then
-- @todo use mw.html.wikitext to buil this
-- @todo use mw.html.wikitext to buil this
html:wikitext( string.format( '[[%s %s]] [[%s%s]]', dag, maande, tonumber(aar) or aar, fkr ) )
return '[['..dag..' '..maande..']] [['..tonumber(aar)..fkr..']]'
end
end
if presisjon == 10 then
if presisjon == 10 then
html:wikitext( string.format( '[[%s]] [[%s%s]]', maande, tonumber(aar) or aar, fkr ) )
-- @todo use mw.html.wikitext to buil this
return maande..' '..tonumber(aar)..''..fkr
end
end
if presisjon == 9 then
if presisjon == 9 then
html:wikitext( string.format( '[[%s%s]]', tonumber(aar) or aar, fkr ) )
-- @todo use mw.html.wikitext to buil this
return '[['..tonumber(aar)..''..fkr..']]'
end
end
if presisjon == 8 then
if presisjon == 8 then
html:wikitext( string.format( '[[%s-årene%s]]', math.floor(((tonumber(aar) or 0))/10)*10, fkr ) )
-- @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:wikitext( string.format( '[[%s. århundre%s]]', math.floor(((tonumber(aar) or 0)+99)/100), fkr ) )
-- @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 tostring(html) .. kalender(value.calendarmodel)
end
end


Linje 94: Linje 106:
end
end


function p.okProperty( claim )
function p.okProperty(prop)
-- Sjekk at claim finnes og inneholder det vi trenger for å lage ok norsk dato
-- Sjekk at prop finnes og inneholder det vi trenger for å lage ok norsk dato
if not claim and claim.type ~= 'statement' then
-- @todo use snaktype instead, then several fields are implied
return nil
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
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
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 ( entity and entity.claims and entity.claims[pv] ) then
if not entity then
return nil
return
end
if not entity['claims'] or not entity['claims'][pv] then
return  
end
end
local prop = entity['claims'][pv]
local props = entity['claims'][pv]
local i = 0
 
local oki = 0
local oki = 0
for i,prop in ipairs(props) do
-- @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.rank or 'normal'
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]
elseif rank == 'normal' then
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 props[oki]
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 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 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 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
-- (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)
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