Documentation du module [voir] [modifier] [purger]
La documentation de ce module Scribunto écrit en Lua est incluse depuis sa sous-page de documentation.

Utilisation modifier

Ce modèle sert à indiquer la durée entre deux dates en années, mois et jours. Il peut servir de clé de tri dans un tableau triable.

Syntaxe modifier

{{durée|<jour1>|<mois1>|<année1>}}

ou

{{durée|<jour1>|<mois1>|<année1>|<jour2>|<mois2>|<année2>}}

Paramètres modifier

  • Les trois premiers paramètres permettent d'indiquer la date la plus ancienne.
  • Les trois derniers paramètres permettent d'indiquer la date la plus récente. Si rien n'est indiqué dans les trois derniers paramètres, les valeurs seront celles actuelles.
  • Variantes : Il est possible d'afficher la durée en nombre de jours (paramètre en jours=oui), en nombre de mois (paramètre en mois=oui), ou en n'affichant que les années (paramètre en années=oui). Lorsque l'un de ces paramètres est utilisé, il est possible de n'afficher que la valeur sans le texte (paramètre masquer texte=oui), ou d'afficher la valeur brute non formatée pour permettre d'utiliser le résultat dans un calcul (paramètre raw=oui).

Exemples modifier

Code wiki Rendu
{{Durée|1|1|2000}}
24 ans, 3 mois et 29 jours
{{Durée|6|4|1977}}
47 ans et 24 jours
{{Durée|2|12|1998|3|11|2001}}
2 ans, 11 mois et 1 jour
{{Durée|1|1|2000|1|2|2001}}
1 an et 1 mois
{{Durée|1|1|2010|2|1|2011}}
1 an et 1 jour
{{Durée|1|1|2000|3|1|2000}}
2 jours
{{Durée|1|1|2000|1|2|2000}}
1 mois
{{Durée|1|1|2000|1|1|2008}}
8 ans
{{Durée|1|1|2000|en années=oui}}
24 ans
{{Durée|1|1|2000|en années=oui|masquer texte=oui}}
24
{{Durée|1|1|2000|en mois=oui}}
291 mois
{{Durée|1|1|2000|en mois=oui|masquer texte=oui}}
291
{{Durée|1|1|2000|en jours=oui}}
8 886 jours
{{Durée|1|1|2000|en jours=oui|masquer texte=oui}}
8 886
{{Durée|1|1|2000|en jours=oui|raw=oui}}
8886

Template Data modifier

Sert à indiquer la durée entre deux dates en années, mois et jours. La deuxième date, si elle n'est pas fournie, est implicitement celle d'aujourd'hui.

Paramètres du modèle

ParamètreDescriptionTypeÉtat
jour11

Jour de la première date

Nombreobligatoire
mois12

Mois de la première date

Nombreobligatoire
année13

Année de la première date

Nombreobligatoire
jour24

Jour de la deuxième date

Par défaut
numéro du jour actuel
Nombresuggéré
mois25

Mois de la deuxième date

Par défaut
numéro du mois actuel
Nombresuggéré
année26

Année de la deuxième date

Par défaut
année actuelle
Nombresuggéré
en joursen jours

Affiche le résultat en jours uniquement (voir aussi {{Durée en jours}})

Valeurs suggérées
oui
Chaînefacultatif
en moisen mois

Affiche le résultat en mois uniquement (voir aussi {{Durée en mois}})

Valeurs suggérées
oui
Chaînefacultatif
en annéesen années

Affiche le résultat en années uniquement

Valeurs suggérées
oui
Chaînefacultatif
masquer textemasquer texte

Masque le texte ''jours'', ''mois'' ou ''ans'' après la durée. Utilisable uniquement si l'un des paramètres ''en jours'', ''en mois'' ou ''en années'' est activé. Le texte reste formaté (notamment, les chiffres sont groupés par trois).

Valeurs suggérées
oui
Chaînefacultatif
rawraw brut

Retourne la valeur numérique brute non formatée pour permettre l'utilisation du résultat dans un calcul. Uniquement utilisable avec les paramètres "en jours", "en mois" ou "en années"

Valeurs suggérées
oui
Chaînefacultatif
local p = {}

local Outils = require 'Module:Outils'

-- liste des mois, écriture exacte et simplifiée, en minuscule
local liste_mois = {
	{ "janvier", "jan.", "janv.", "jan", "janv", "january", nJour = 31 },
	{ "février", "fevrier", "fev.", "fev", "fév.", "fév", "february", nJour = 28 },
	{ "mars", "mar.", "mar", "march", nJour = 31 },
	{ "avril", "avr.", "avr", "apr", "april", nJour = 30 },
	{ "mai", "may", nJour = 31 },
	{ "juin", "jun", "june", nJour = 30 },
	{ "juillet", "juil.", "juil", "juill.", "juill", "jul", "july", nJour = 31 },
	{ "août", "aout", "aou", "aug", "august", nJour = 31 },
	{ "septembre", "sept.", "sept", "sep.", "sep", "september", nJour = 30 },
	{ "octobre", "oct.", "oct", "october", nJour = 31 },
	{ "novembre", "nov.", "nov", "november", nJour = 30 },
	{ "décembre", "decembre", "déc.", "dec.", "dec", "déc", "december", nJour = 31 },
}

local function joursMois( m, a )
	a = a or 1
	if m == 0 then
		return 31
	elseif m == 2 then
		local b = ( a % 4 == 0 ) and ( ( a % 100 ~= 0 ) or ( a % 400 == 0 ) )
		return 28 + ( b and 1 or 0 )
	else
		return liste_mois[m].nJour
	end
end

function erreur( texte )
	local cat = '[[Catégorie:Page utilisant un modèle avec une syntaxe erronée|Durée]]'
	local message = '<span class="error">erreur : '  .. texte .. '</span>'
	local ns = mw.title.getCurrentTitle().namespace
	if ns == 0 then
		return message .. cat
	else
		return message
	end
end

---
local function determinationMois( mois )
	if tonumber( mois ) then
		local num = math.floor( tonumber( mois ) )
		if num > 0 and num <= 12 then
			return num
		end
	elseif type( mois ) == 'string' and mw.text.trim( mois ) ~= '' then
		local nom = mw.ustring.lower( mois )
		for num = 1, 12 do
			local i = 1
			while liste_mois[num][i] do
				if liste_mois[num][i] == nom then
					return num
				end
				i = i + 1
			end
		end
	end
end

function p._duree( args )
	local maintenant = os.date( '!*t' )
	local fuseau = mw.getContentLanguage():formatDate("Z", nil, true)/3600
	if maintenant.hour + fuseau > 23 then
		maintenant.day = maintenant.day + 1
	end

	local enjours = args["en jours"]
	local enmois = args["en mois"]
	local enanneesetjours = args["en années et jours"]
	local enannee = not enanneesetjours and (args["en année"] or args["en années"])
	local raw = (args["raw"] and args["raw"] ~= "-") or (args["brut"] and args["brut"] ~= "-")

	local precision = 'jour'
	local jour1 = tonumber( args[1] )
	local mois1 = determinationMois( args[2] )
	local annee1 = tonumber( args[3] )
	if jour1 and jour1 > 31 and (not annee1 or annee1 <= 31) then
		local y = jour1
		jour1 = annee1
		annee1 = y
	end
	if not jour1 then
		precision = 'mois'
		-- jour1 = maintenant.day
		jour1 = 1
	end
	if not mois1 then 
		if precision == 'mois' then
			precision = 'an'
			-- mois1 = maintenant.month
			mois1 = 1
		else
			return erreur( 'mois invalide (' .. ( args[2] or '' ) .. ')' )
		end
	end
	if not annee1 then
		if precision == 'an' then
			return
			-- return erreur( 'aucune année fournit' ) -- suggestion
		else
			annee1 = maintenant.year
		end
	end

	local jour2 = tonumber( args[4] ) or maintenant.day
	local mois2 = determinationMois( args[5] ) or maintenant.month
	local annee2 = tonumber( args[6])  or maintenant.year
	if jour2 > 31 and annee2 <= 31 then
		local y = jour2
		jour2 = annee2
		annee2 = y
	end
		
	local tri = os.difftime(
		os.time{ year = annee2, month = mois2, day = jour2 },
		os.time{ year = annee1, month = mois1, day = jour1 }
		) / 86400
	if tri < 0 then
		return erreur( 'durée inférieure à 0' )
	end
	local nbjours = tri
	tri = 0 .. tostring( tri )
	tri = string.rep( '&', 16 - #tri ) .. tri
	
	if enjours then
		if raw then
			return nbjours
		else
			local moduleUnite = require 'Module:Unité'
			local unit
			if not args['masquer texte'] or args['masquer texte'] == '' then 
				if nbjours> 1 then unit = 'jours' else unit = 'jour' end
			end
			nbjours = moduleUnite._unite({nbjours, unit})
			return mw.text.tag{ 
				name = 'span', 
				attrs = { class = 'datasortkey', ['data-sort-value'] = tri }, 
				content = nbjours
			}
		end
	end

	local njour = jour2 - jour1
	local nmois = mois2 - mois1
	local nannee = annee2 - annee1
	if njour < 0 then
		nmois = nmois - 1
		njour = njour + joursMois( mois2 - 1, annee2 )
	end
	if nmois < 0 then
		nannee = nannee - 1
		nmois = nmois + 12
	end

	if enmois then
		local nbmois = nannee * 12 + nmois
		if raw then
			return nbmois
		else
			local moduleUnite = require 'Module:Unité'
			local unit
			if not args['masquer texte'] or args['masquer texte'] == '' then
				unit = 'mois'
			end
			nbmois = moduleUnite._unite({nbmois, unit})
			return mw.text.tag{ 
				name = 'span', 
				attrs = { class = 'datasortkey', ['data-sort-value'] = tri }, 
				content = nbmois
			}
		end
	end
	if enannee then
		if raw then
			return nannee
		else
			local moduleUnite = require 'Module:Unité'
			local unit
			if not args['masquer texte'] or args['masquer texte'] == '' then 
				if nannee > 1 then unit = 'ans' else unit = 'an' end
			end
			nannee = moduleUnite._unite({nannee, unit})
			return mw.text.tag{ 
				name = 'span', 
				attrs = { class = 'datasortkey', ['data-sort-value'] = tri }, 
				content = nannee
			}
		end
	end

	local result = {}
	local conjunction
	local function add( nombre, singulier, pluriel )
		if nombre > 0 then
			local texte = pluriel
			if nombre == 1 then
				texte = singulier
			end
			table.insert( result, nombre .. '\194\160' .. texte )
		end
	end
	if enanneesetjours then
		conjunction = ', '
		if precision ~= 'an' then
			nannee = annee2 - annee1
			njour = os.difftime(
				os.time{ year = annee2, month = mois2, day = jour2 },
				os.time{ year = annee2, month = mois1, day = jour1 }
				) / 86400
			if njour < 0 then
				nannee = nannee - 1
				njour = os.difftime(
					os.time{ year = annee2, month = mois2, day = jour2 },
					os.time{ year = annee2, month = 1, day = 1}
					) / 86400
					+ os.difftime(
					os.time{ year = annee1 + 1, month = 1, day = 1},
					os.time{ year = annee1, month = mois1, day = jour1 }
					) / 86400
			end
			add( nannee, 'an', 'ans' )
			add( njour, 'jour', 'jours' )
		else
			add( nannee, 'an', 'ans' )
		end
	else
		add( nannee, 'an', 'ans' )
		if precision ~= 'an' then
			add( nmois, 'mois', 'mois' )
		end
		if precision == 'jour' then
			add( njour, 'jour', 'jours' )
		end
	end

	if #result == 0 then
		result[1] = 'moins d’un ' .. precision
		tri = 0
	end

	return mw.text.tag{ 
		name = 'span', 
		attrs = { class = 'datasortkey', ['data-sort-value'] = tri }, 
		content = mw.text.listToText( result, nil, conjunction )
	}
end


function p.duree( frame )
	local args = Outils.extractArgs( frame )
	for i = 1, 6 do
		if tonumber( args[i] ) == 0 then
			args[i] = ''
		end
	end

	return p._duree( args )
end

return p