Modul:WikidataDato: Forskjell mellom sideversjoner

Fra Wikisida.no
Hopp til navigering Hopp til søk
Ingen redigeringsforklaring
(Små forbedringer av koden, samt oppdaterer den ulenkede datofunksjonen)
Linje 24: Linje 24:
if string.sub(timestamp, 1, 1) == '-' then
if string.sub(timestamp, 1, 1) == '-' then
aar = aar..' f.Kr.'
aar = aar..' f.Kr.'
end
end
return aar,maande,dag
return aar,maande,dag
end
end
Linje 43: Linje 43:
utstring = dag..' '..maande..' '..aar
utstring = dag..' '..maande..' '..aar
end
end
if presisjon == 10 then
if presisjon == 10 then
utstring = maande..' '..aar
utstring = maande..' '..aar
end
end
if presisjon == 9 then
if presisjon == 9 then
utstring = aar
utstring = aar
Linje 63: Linje 63:
return '[['..dag..' '..maande..']] [['..aar..']]'
return '[['..dag..' '..maande..']] [['..aar..']]'
end
end
if presisjon == 10 then
if presisjon == 10 then
return maande..' '..aar
return maande..' '..aar
end
end
if presisjon == 9 then
if presisjon == 9 then
return '[['..aar..']]'
return '[['..aar..']]'
end
end
Linje 79: Linje 79:


local function frameargs(frame)
local function frameargs(frame)
local args = frame.args
local args = frame.args
if args[1] == nil then
if args[1] == nil then
local pFrame = frame:getParent();
local pFrame = frame:getParent();
args = pFrame.args;
args = pFrame.args;
for k,v in pairs( frame.args ) do
for k,v in pairs( frame.args ) do
args[k] = v;
args[k] = v;
end
end
end
end
return args['qv'],args['pv']
return args['qv'],args['pv']
end
end


function p.okProperty(prop)

-- Sjekk at prop finnes og inneholder det vi trenger for å lage ok norsk dato
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)
function p.finnBesteProperty(frame)
Linje 106: Linje 120:
while i < #prop do
while i < #prop do
i = i + 1
i = i + 1
local rank = prop[i]["rank"]
if p.okProperty(prop[i]) then
if rank == 'preferred' then
local rank = prop[i]["rank"]
if rank == 'preferred' then
return prop[i]
return prop[i]
end
end
if rank == 'normal' then
if oki == 0 then
if rank == 'normal' then
oki = i
if oki == 0 then
oki = i
end
end
end
end
end
Linje 126: Linje 142:
return ""
return ""
end
end
-- prop er nå en ok property.
if not prop['mainsnak']["datavalue"]
-- Hvis det finnes en med rank preferred er den valgt
or not prop['mainsnak']["datavalue"]["value"]["precision"]
-- Hvis ingen preferred, er den første med normal valgt.
then
-- Det siste er tilfeldig, men kan antas være mindre utsatt for tilfeldige endringer enn å velge den siste
return ""
end
local presisjon = prop['mainsnak']["datavalue"]["value"]["precision"]
local presisjon = prop['mainsnak']["datavalue"]["value"]["precision"]
local timestamp = prop['mainsnak']["datavalue"]["value"]["time"]
local timestamp = prop['mainsnak']["datavalue"]["value"]["time"]
Linje 138: Linje 153:


function p.norskDato(frame)
function p.norskDato(frame)
local qv,pv = frameargs(frame)
local prop = p.finnBesteProperty(frame)
if not prop then
local entity = mw.wikibase.getEntity(qv)
return ""
if not entity then
return "feil i entity"
end
end
-- prop er nå en ok property.
local presisjon = entity['claims'][pv][1]['mainsnak']["datavalue"]["value"]["precision"]
-- Hvis det finnes en med rank preferred er den valgt
local timestamp = entity['claims'][pv][1]['mainsnak']["datavalue"]["value"]["time"]
-- Hvis ingen preferred, er den første med normal valgt.
local kal = entity['claims'][pv][1]['mainsnak']["datavalue"]["value"]["calendarmodel"]
-- 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 norskDato(timestamp, presisjon) .. kalender(kal)
return norskDato(timestamp, presisjon) .. kalender(kal)
end
end

Sideversjonen fra 27. sep. 2015 kl. 19:53

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 = {}


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)
	local aar = tonumber(string.sub(timestamp, 2, 5))
	local maande = maanednavn[tonumber(string.sub(timestamp, 7, 8))]
	local dag = tonumber(string.sub(timestamp, 10, 11))..'.'
	if string.sub(timestamp, 1, 1) == '-' then
		aar = aar..' f.Kr.'
	end
	return aar,maande,dag
end

function kalender(kal)
	if kal == 'http://www.wikidata.org/entity/Q1985727' then
		return ''
	end
	if kal == 'http://www.wikidata.org/entity/Q1985786' then
		return ' ([[Den julianske kalenderen|juliansk]])'
	end
	return kal
end

local function norskDato(timestamp, presisjon)
	local aar,maande,dag =  splitTimestamp(timestamp)
	if presisjon == 11 then
		utstring = dag..' '..maande..' '..aar
	end
	if presisjon == 10 then
		utstring = maande..' '..aar
	end
    if presisjon == 9 then
		utstring = aar
	end
    if presisjon == 8 then
		utstring = tonumber(string.sub(aar, 1, 3))..'0-årene'
    end
    if presisjon == 7 then
		utstring = tonumber(string.sub(aar,1, 2))..'. århundre'
    end
    return utstring
end

local function norskDatoLenket(timestamp, presisjon)
	local aar,maande,dag =  splitTimestamp(timestamp)
	if presisjon == 11 then
		return '[['..dag..' '..maande..']] [['..aar..']]'
	end
	if presisjon == 10 then
		return maande..' '..aar
	end
	if presisjon == 9 then
		return '[['..aar..']]'
	end
	if presisjon == 8 then
		return '[['..tonumber(string.sub(aar, 1, 3))..'0-årene]]'
	end
	if presisjon == 7 then
		return '[['..tonumber(string.sub(aar, 1, 2))..'. århundre]]'
	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
	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
	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
	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"]
	return norskDato(timestamp, presisjon) .. kalender(kal)
end

	

return p