Communauté • Livre d'or
Actualités, astuces, interview... Venez lire la gazette de ce printemps de Vikidia !
Actualités, astuces, interview... Venez lire la gazette de ce printemps de Vikidia !
Module:Navigation année
Aller à la navigation
Aller à la recherche
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.
La documentation de ce module est incluse depuis sa sous-page de documentation (modifier | historique).
Veuillez placer les catégories dans la sous-page /Documentation.
Les éditeurs peuvent travailler dans le bac à sable (créer).
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> millénaire'
elseif valeur2 > 0 then -- facteur == 100
texte = '[['
.. rom
.. exp
.. ' siècle|<span class="romain">'
.. mw.ustring.lower( rom )
.. '</span><sup>'
.. exp
.. '</sup> siècle]]'
else -- facteur == 100 and valeur2 <= 0
texte = '<span class="romain">'
.. mw.ustring.lower( rom )
.. '</span><sup>'
.. exp
.. '</sup> siècle'
end
if valeur2 < 0 then
texte = texte .. ' <abbr class="abbr" title="avant Jésus-Christ">av. 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