Aller au contenu

Module:Wikidata/Dates

Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 18 janvier 2015 à 20:38 et modifiée en dernier par Zolo (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

 Documentation[créer] [purger]
-- sert à récupérer des données usuelles sur Wikidata (les fonctions élémentaires pour l'extraction des données se fait sur Module:Wikidata
-- ce module peut-être appelé par Module:InfoboxBuilder/Helpers qui les met en infobox
local p = {}
local formatDate = require "Module:Date complexe"
local dateModule = require "Module:Date"

local numericprecision = { -- convertir les précisions en valeurs numériques = à celles utilisées par Wikidata
	gigayear = 0,
	megayear = 3,
	millenium = 6,
	century = 7,
	decade = 8,
	year = 9,
	month = 10,
	day = 11,
	hour = 12,
	minute = 12,
	second = 14,
}

local function splitTimestamp(timestamp, calendar)
	local era, year, month, day
	era = string.sub(timestamp, 1, 1)
	year = tonumber(string.sub(timestamp, 9, 12))
	month = string.sub(timestamp, 14, 15)
	day = string.sub(timestamp, 17, 18)
	
	if calendar == 'julian' then
		year, month, day = formatdate.gregorianToJulian( era .. year, month, day )
	end

	return {day = day, month = month, year = year, era = era, timestamp = timestamp, type = 'dateobject'}
end

function p.rangeobject(begin, ending, params)
	local timestamp
	if begin then
		timestamp = begin.timestamp
	else
		timestamp = ending.timestamp
	end
	return {begin = begin, ending = ending, timestamp = timestamp, type = 'rangeobject'}
end

function p.dateobject(orig, params) -- transforme un snak en un nouvel objet utilisable par Module:Date complexe
	if not params then
		params = {}
	end
	
	local newobj = splitTimestamp(orig.time, orig.calendar) -- initalise l'object en mettant la valeur des dates
	
	-- ajoute la clé "precision"
	newobj.precision = orig.precision
	
	if params.precision then
		local paramprec = tonumber(params.precision)
		if not paramprec then-- si la valeur du paramètre n'est pas numérique or
			paramprec = numericprecision[params.precision] -- que faire en cas de valeur invalide ?
		end
		if paramprec and paramprec < newobj.precision then
			-- on peut afficher une valeur moins précise que celle stockée, mais plus précise n'aurait pas de sens
			newobj.precision = paramprec
		end
	end
	newobj.type = 'dateobject'
	return newobj
end

function p.objecttotext(obj, params)
	if obj.type == 'dateobject' then
		return formatDate.simplestring(obj)
	elseif obj.type == 'rangeobject' then
		return formatDate.daterange(obj.begin, obj.ending, params)
	end
end

function p.duration(range)
	if not range.begin and range.ending then
		return nil
	else 
		a, b = range.begin, range.ending
	end
	return datemodule.age(a.year, a.month, a.day, b.year, b.month, b.day)
end

return p