Module:WikidataDato

د ويکيپېډيا، وړیا پوهنغونډ له خوا

لاسوند لپاره ددې موډيول کېدای سی په Module:WikidataDato/لاسوند کي وي

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 = {'جنوري', 'فبروري', 'مارچ', 'اپریل', 'می', 'جون', 'جولای', 'اګست', 'سپټمبر', 'اکتوبر', 'نومبر', 'ډسمبر'}

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 pashto date fra en Wikidata-påstand
-- (enten en "mainsnak" eller en "qualifier"). Funksjonen eksporteres
-- slik at den kan brukes av andre moduler.
function p.pashtoDateFraClaim(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 pashto date fra en Wikidata-påstand
-- (enten en "mainsnak" eller en "qualifier"). Funksjonen eksporteres
-- slik at den kan brukes av andre moduler.
function p.pashtoDateLenketFraClaim(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.pswiki, 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 pashto date
	-- @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.pashtoDateLenket(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.pashtoDateLenketFraClaim(prop.mainsnak)
end

function p.pashtoDate(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.pashtoDateFraClaim(prop.mainsnak)
end

-- Denne funksjonen formaterer en pashto date 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 pashto date 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