Communauté  • Livre d'or
Chats noirs.jpg Actualités, astuces, interview... Venez lire la gazette de ce printemps de Vikidia ! DessinInterview.png
Cette page est semi-protégée.

Module:Navigation année

Aller à la navigation Aller à la recherche
 Documentation[modifier] [purger]

Le module : Navigation année sert à faire fonctionner le modèle : Navigation année et le modèle : Au même moment, voir leurs documentations respectives.

À faire

  • Les affichages de siècles et millénaires devraient être gérés par un module à part.
  • Le rendu et l’accessibilité des deux modèles sont améliorables.
local p = {}

--
-- Fonctions internes
--

local function entete( titre, ligne )
	local retour = mw.html.create( 'div' )
	retour = retour:css( 'display', 'block' )
	               :css( 'grid-column-start', '1' )
	               :css( 'grid-column-end', '3' )
	               :css( 'grid-row-start', tostring( ligne ))
	               :css( 'grid-row-end', tostring( ligne + 1 ))
	               :css( 'border', '1px solid #222' )
	               :css( 'padding', '4px' )
	               :css( 'min-width', '3em' )
	               :wikitext( titre )
	return retour
end

local function ligneAnnee( date, nombre, padding, facteur, span, ligne )
	local retour = mw.html.create( 'ul' )
	retour = retour:css( 'display', 'contents' )

	local valeur = math.floor( date / facteur )

	nombre = ((nombre / span) - 1) / 2
	local texte
	local i = -1 * nombre
	while i <= nombre do
		local valeur2 = (valeur + i) * facteur
		if facteur == 1 then  -- la première décennie avant J.-C. va bien de -10 à -1 inclus, et la première ne peut être écrite que « 0 »
			if valeur <= 0 then
				valeur2 = valeur2 + 1
			end
			if valeur2 <= 0 then
				valeur2 = valeur2 - 1
			end
		end

		if facteur == 1 then
			texte = '[[' .. tostring( valeur2 ) .. ']]'
		else -- facteur == 10
			texte = '[[Années ' .. tostring( valeur2 ) .. '|' .. tostring( valeur2 ) .. ']]'
		end
		retour = retour:tag( 'li' ):css( 'display', 'block' )
		                           :css( 'margin', '0' )
		                           :css( 'grid-column-start', tostring( padding + (i + nombre) * span ))
		                           :css( 'grid-column-end', tostring( padding + (i + nombre + 1) * span ))
		                           :css( 'grid-row-start', tostring( ligne ))
		                           :css( 'grid-row-end', tostring( ligne + 1 ))
		                           :css( 'border', '1px solid #222' )
		                           :css( 'text-align', 'center' )
		                           :css( 'padding', '4px' )
		                           :wikitext( (i ~= 0) and texte or ("'''" .. texte .. "'''") )
		                           :done()
		i = i + 1
	end
	return retour
end

local function ligneModele( date, facteur, ligne )
	local retour = mw.html.create( 'ul' )
	retour = retour:css( 'display', 'contents' )

	if date >= 0 then
		date = date - 1
	end
	local valeur = math.floor( date / facteur )

	local texte
	local module = require( 'Module:Chiffres romains' )
	local i = -1
	while i <= 1 do
		local valeur2 = valeur + i
		if valeur2 >= 0 then
			valeur2 = valeur2 + 1
		end
		local abs = math.abs( valeur2 )
		local exp = abs == 1 and 'er' or 'e'
		local rom = module._ChiffresRomains( abs )

		if facteur == 1000 then
			texte = rom
			     .. '<sup>'
			     .. exp
			     .. '</sup>&nbsp;millénaire'
		elseif valeur2 > 0 then -- facteur == 100
			texte = '[['
			     .. rom
			     .. exp
			     .. ' siècle|<span class="romain">'
			     .. mw.ustring.lower( rom )
			     .. '</span><sup>'
			     .. exp
			     .. '</sup>&nbsp;siècle]]'
		else -- facteur == 100 and valeur2 <= 0
			texte = '<span class="romain">'
			     .. mw.ustring.lower( rom )
			     .. '</span><sup>'
			     .. exp
			     .. '</sup>&nbsp;siècle'
		end

		if valeur2 < 0 then
			texte = texte .. ' <abbr class="abbr" title="avant Jésus-Christ">av.&nbsp;J.-C.</abbr>'
		elseif facteur == 1000 then -- pas pour les siècles
			texte = texte .. ' <abbr class="abbr" title="après Jésus-Christ">apr. J.-C.</abbr>'
		end

		retour = retour:tag( 'li' ):css( 'display', 'block' )
		                           :css( 'margin', '0' )
		                           :css( 'grid-column-start', tostring( 3 + (i + 1) * 5 ))
		                           :css( 'grid-column-end', tostring( 3 + (i + 2) * 5 ))
		                           :css( 'grid-row-start', tostring( ligne ))
		                           :css( 'grid-row-end', tostring( ligne + 1 ))
		                           :css( 'border', '1px solid #222' )
		                           :css( 'text-align', 'center' )
		                           :css( 'padding', '4px' )
		                           :wikitext( (i ~= 0) and texte or ("'''" .. texte .. "'''") )
		                           :done()
		i = i + 1
	end
	return retour
end

--
-- Fonctions appelables depuis les modèles
--

function p.Navigation( frame )
	local args = frame:getParent().args
	local date = tonumber( args[1] )

	if date == nil or date == 0 or date ~= math.floor( date ) then
		error( 'année non comprise par le modèle : Navigation année' )
	end

	local retour = mw.html.create( 'div' )
	retour = retour:tag( 'ul' ):css( 'display', 'grid' )
	                           :css( 'grid-template-columns', 'repeat(17, 1fr)' )
	                           :css( 'grid-template-rows', 'repeat(4, 1fr)' )
	                           :css( 'width', '51em' )
	                           :css( 'background-color', '#cdcdcd' )
	                           :css( 'border', '1px solid #222' )
	                           :css( 'margin', 'auto' )
	               :tag( 'li' ):css( 'display', 'contents' )
	                           :css( 'margin', '0' )
	                           :node( entete( '[[Année]]s', 1 ))
	                           :node( ligneAnnee( date, 15, 3, 1, 1, 1 ))
	                           :done()
	               :tag( 'li' ):css( 'display', 'contents' )
	                           :css( 'margin', '0' )
	                           :node( entete( '[[Décennie]]s', 2 ))
	                           :node( ligneAnnee( date, 15, 3, 10, 3, 2 ))
	                           :done()
	               :tag( 'li' ):css( 'display', 'contents' )
	                           :css( 'margin', '0' )
	                           :node( entete( '[[Siècle]]s', 3 ))
	                           :node( ligneModele( date, 100, 3 ))
	                           :done()
	               :tag( 'li' ):css( 'display', 'contents' )
	                           :css( 'margin', '0' )
	                           :node( entete( '[[Millénaire]]s', 4 ))
	                           :node( ligneModele( date, 1000, 4 ))
	                           :done()
	               :done()
	               :tag( 'div' ):css( 'clear', 'both' ):done()

	return retour
end

function p.AuMemeMoment( frame )
	local args = frame:getParent().args
	local date = tonumber( args[1] )

	if date == nil or date == 0 or date ~= math.floor( date ) then
		error( 'année non comprise par le modèle : Au même moment' )
	end

	local retour = mw.html.create( 'div' )
	retour = retour:css( 'display', 'grid' )
	               :css( 'grid-template-columns', 'repeat(17, 1fr)' )
	               :css( 'grid-template-rows', '1fr' )
	               :css( 'width', '51em' )
	               :css( 'background-color', '#cdcdcd' )
	               :css( 'border', '1px solid #222' )
	               :css( 'margin', 'auto' )
	               :tag( 'div' ):css( 'display', 'block' )
	                            :css( 'grid-column-start', '1' )
	                            :css( 'grid-column-end', '7' )
	                            :css( 'grid-row-start', '1' )
	                            :css( 'grid-row-end', '2' )
	                            :css( 'border', '1px solid #222' )
	                            :css( 'padding', '4px' )
	                            :css( 'min-width', '10em' )
	                            :wikitext( 'Au même moment… dans le monde' )
	                            :done()
	               :node( ligneAnnee( date, 11, 7, 10, 1, 1 )):done()
	               :done()
	               :tag( 'div' ):css( 'clear', 'both' ):done()

	return retour
end

return p