Module:Date républicaine
Le module date républicaine permet la mise en forme de dates du calendrier républicain. Il est lié aux modèles {{date républicaine}} et {{date républicaine-}}.
Utilisation
Fonctions utilisables depuis un modèle
date_republicaine(frame)
– renvoie une chaîne de caractères présentant une date du calendrier républicain avec les liens les plus pertinents en respectant les conventions typographiques, et éventuellement la date du calendrier républicain correspondante.date_republicaine_sans_liens(frame)
– renvoie une chaîne de caractères présentant une date du calendrier républicain en respectant les conventions typographiques, et éventuellement la date du calendrier républicain correspondante.
Fonctions utilisables depuis un autre module
conversion_Gregorien(jour, mois, an)
– renvoie les jours, mois et années dans le calendrier républicain à partir des jour, mois et année dans le calendrier grégorien._date_republicaine(liens, {a1, a2, a3, a4})
– renvoie une chaîne de caractères présentant une date du calendrier républicain avec les liens les plus pertinents en respectant les convention typographiques (en paramètres : un booléen indiquant s'il faut faire des liens, et un table contenant une chaine de caractères avec une date du calendrier républicain en extension (« jour mois année », ou une chaîne de caractère par élément (« jour », « mois », « année »)).
Autres fonctions
extraction_argument (argument, chaine)
– extrait de « argument » une chaine de caractère correspondant au pattern « chaine » ainsi que des informations sur le mode d'affichage de l'élément (suivi de « - » : ne pas afficher ; suivi de « * », ne pas présenter de lien wiki pour cet élément), et renvoie argument délesté de cette chaîne.test_argument (argument)
– analyse les paramètres fournis à la fonction_date républicaine(frame)
annee_affichee(annee, lien_annee, libelle_an)
– mise en forme de l'année (liens et typographie) composant une date du calendrier républicain.categorie_erreur (message)
– mise en forme d'un message d'erreur avec insertion d'une catégorie de maintenance.
Modules externes dont ce module a besoin pour fonctionner
Module:Date
- mise en forme des dates du calendrier grégorien.Module:Chiffres romains
- mise en forme des expressions contenant des chiffres romains.Module:Outils
- bibliothèque d'outils.
Fonctionnement
La mise en forme et le paramétrage ont été définis en fonction des conventions typographiques et de l'usage de présentation des dates dans les articles.
Le frame
reçu peut se présenter sous deux formes :
- avec séparateurs :
{{date républicaine|jour|mois|année|(paramètre conversion optionnel)}}
; - sans séparateurs :
{{date républicaine|jour mois année|(paramètre conversion optionnel)}}
.
Le module analyse crée une chaîne concaténant tous les paramètres qui ne contiennent pas « conversion ». Il est nécessaire que :
- l'année, si elle est fournie, soit en chiffres romains ; elle peut être précédée de « an » ou « de l'an », avec ou sans majuscule, les deux apostrophes sont acceptées ;
- l'orthographe du mois, si il est fourni, soit exacte aux accents près ;
- le jour, s'il est fourni, soit numérique.
Les liens créés suivent la même logique que le modèle date :
- pour le jour : [[jour mois]], sinon pas de lien ;
- pour le mois : [[mois année]], sinon [[mois]] (tous les mois ont un article) ;
- pour l'année : [[année]] (toutes les années ont un article).
Accessibilité :
- les nombres en chiffres romains sont dotés d'une infobulle donnant leur valeur en chiffres arabes.
Typographie :
- les éléments sont séparés par des espaces insécables ;
- les mois et année sont affichés avec une minuscule, sauf dans le cas où ils sont les premiers éléments de la chaîne de caractère renvoyée, auquel cas la casse retenue est celle fournie en entrée (cas où le mois ou l'année sont au début d'une phrase) ;
- le choix de l'apostrophe est laissé au rédacteur, le module restitue celle fournie en entrée.
Mode de sélection des éléments affichés :
- comme pour le module Date, la mention d'un « - » accolé à un élément permet d'en éviter l'affichage ;
- la mention d'un « * » accolé à un élément permet d'éviter l'affichage d'un lien pour cet élément (inutile pour le module Date_republicaine_sans_lien, mais ne provoque pas d'erreur).
Paramètre de conversion en date grégorienne (passage d'un élément contenant « conversion » ou « grégorien ») :
- séparateur :
- par défaut, la présentation est de la forme « jj mois an NN (jj mois an) »,
- en précisant « : » (« conversion: » ou « grégorien: »), la présentation est de la forme « jj mois an NN : jj mois an » ;
- affichage ou non des liens :
- sélection des éléments à afficher :
- l'ajout d'une combinaison des lettres j, m et a (j : jour, m : mois, a : année) permet de sélectionner les éléments de la date grégorienne à afficher. Sans précision ou en précisant « jma » tout est affiché, en précisant « jm » seul le jour et le mois sont affichés, etc.
Exemples
Pour plus d'exemples, voir les pages de test des modèles date républicaine et date républicaine- permettant d'évaluer les modifications apportées.
{{#invoke:Date républicaine|date_republicaine|1er vendémiaire an II}}
→ 1er vendémiaire an II{{#invoke:Date républicaine|date_republicaine|1er vendémiaire de l’an II}}
→ 1er vendémiaire an II{{#invoke:Date républicaine|date_republicaine_sans_liens|1er vendémiaire an II}}
→ Erreur de script : la fonction « date_republicaine_sans_liens » n’existe pas.{{#invoke:Date républicaine|date_republicaine|2 vendémiaire an II}}
→ 2 vendémiaire an II{{#invoke:Date républicaine|date_republicaine|2 vendémiaire an III}}
→ 2 vendémiaire an III{{#invoke:Date républicaine|date_republicaine|Vendémiaire an III}}
→ vendémiaire an III{{#invoke:Date républicaine|date_republicaine|An III}}
→ an III{{#invoke:Date républicaine|date_republicaine|1er vendémiaire* an II}}
→ 1er vendémiaire an II{{#invoke:Date républicaine|date_republicaine|1er vendémiaire an II-}}
→ 1er vendémiaire an II{{#invoke:Date républicaine|date_republicaine|1er vendémiaire an II|grégorien}}
→ 1er vendémiaire an II{{#invoke:Date républicaine|date_republicaine|1er vendémiaire an II|grégorien*}}
→ 1er vendémiaire an II{{#invoke:Date républicaine|date_republicaine|1er vendémiaire an II|grégorien:}}
→ 1er vendémiaire an II{{#invoke:Date républicaine|date_republicaine|1er vendémiaire an II|grégorien jm}}
→ 1er vendémiaire an II
La documentation de ce module est générée par le modèle {{Documentation module}}.
Elle est incluse depuis sa sous-page de documentation. Veuillez placer les catégories sur cette page-là.
Les éditeurs peuvent travailler dans le bac à sable (modifier).
Voir les statistiques d'appel depuis le wikicode sur l'outil wstat et les appels depuis d'autres modules.
local p = {}
local Outils = require( 'Module:Outils' )
local trim = Outils.trim
local test_conversion, test_quantieme, test_mois, test_an = false, false, false, false
local presence_quantieme, presence_mois, presence_an = 0, 0 ,0
local jour, jour_affiche, mois, an = '', '', '', ''
local article = ''
local nombre = ''
local erreur = false
local message = ''
local type_romains = "[IVXL]+"
local type_nombre = "[0-9]+"
local type_quantieme = "[1-3]?[0-9][er]?"
local type_1er = "1er"
local type_an_republicain = "[Aa]n [IVXL]+"
local quantieme, mois, an = '', '', ''
-- Table des noms des mois républicains, avec la casse de la première lettre et les erreurs acceptables
local listeNomsMois = {
{"vendémiaire", "vendémiaire"},
{"vendemiaire", "vendémiaire"},
{"Vendémiaire", "vendémiaire"},
{"Vendemiaire", "vendémiaire"},
{"brumaire", "brumaire"},
{"Brumaire", "brumaire"},
{"frimaire", "frimaire"},
{"Frimaire", "frimaire"},
{"nivôse", "nivôse"},
{"nivose", "nivôse"},
{"Nivôse", "nivôse"},
{"Nivose", "nivôse"},
{"pluviôse", "pluviôse"},
{"pluviose", "pluviôse"},
{"Pluviôse", "pluviôse"},
{"Pluviose", "Pluviôse"},
{"ventôse", "ventôse"},
{"ventose", "ventôse"},
{"Ventôse", "ventôse"},
{"Ventose", "ventôse"},
{"germinal", "germinal"},
{"Germinal", "germinal"},
{"floréal", "floréal"},
{"floreal", "floréal"},
{"Floréal", "floréal"},
{"Floreal", "floréal"},
{"prairial", "prairial"},
{"Prairial", "prairial"},
{"messidor", "messidor"},
{"Messidor", "messidor"},
{"thermidor", "thermidor"},
{"Thermidor", "thermidor"},
{"fructidor", "fructidor"},
{"Fructidor", "fructidor"}
}
-- Table temporaire pour éviter les requêtes de test d'existence des articles.
-- Liste des articles existants sur les jours/mois, à remplacer par un table externe
local listeArticlesJours = {
["1er vendémiaire"] = true,
["7 vendémiaire"] = true,
["13 vendémiaire"] = true,
["14 vendémiaire"] = true,
["15 vendémiaire"] = true,
["16 vendémiaire"] = true,
["17 vendémiaire"] = true,
["18 vendémiaire"] = true,
["19 vendémiaire"] = true,
["20 vendémiaire"] = true
}
-- Table temporaire pour éviter les requêtes de test d'existence des articles.
-- Liste des articles existants sur les mois/année, à remplacer par un table externe
local listeArticlesMois = {
["floréal an LXXIX"] = true,
["prairial an LXXIX"] = true,
["vendémiaire an II"] = true
}
-- liste des chiffres romains pour contrôle mise en forme de l'infobulle
local listeRomains = { ["I"] = "1",
["II"] = "2",
["III"] = "3",
["IV"] = "4",
["V"] = "5",
["VI"] = "6",
["VII"] = "7",
["VIII"] = "8",
["IX"] = "9",
["X"] = "10",
["XI"] = "11",
["XII"] = "12",
["XIII"] = "13",
["XIV"] = "14",
["LXXIX"] = "79"
}
-- Extraction d'éventuels jour, mois et année du calendrier républicain. Le paramètre en entrée est sous la forme :
-- l'année doit être en chiffres romains
-- "an" peut être omis devant l'année
-- le jour doit être numérique, "er" est toléré pour le premier jour de chaque mois
-- les paramètres peuvent être présentés dans n'importe quel ordre
-- les mois doivent être orthographiés correctement, les accents peuvent être omis. La majuscule n'est pas prise en compte
function p.test_argument (argument)
local position = 0
local chaine, chaine1, chaine2 = '', '', ''
-- On retire l'éventuel "er" de "1er" pour simplifier le traitement qui suit
position = string.find (argument, '1er')
if position
then
if position == 1
then
chaine='1'..string.sub (argument, 4)
else
chaine1=string.sub (argument, 1, position-2)
chaine2=string.sub (argument, position+4)
chaine = chaine1..' '..chaine2
end
argument=chaine
end
-- On recherche le mois, s'il existe il est retiré de la chaîne de caractère analysée
for i = 1, 34 do
position = string.find (argument, listeNomsMois[i][1])
if position
then
if position == 1
then
chaine=string.sub (argument, string.len(listeNomsMois[i][1]) + 2)
else
chaine1=string.sub (argument, 1, position-1)
chaine2=string.sub (argument, position + string.len(listeNomsMois[i][1]) + 1)
chaine = chaine1..chaine2
end
argument=chaine
mois = listeNomsMois[i][2]
test_mois = true
i = 34
end
end
-- On recherche le jour en chiffres. Si on le trouve, il est retiré de la chaîne analysée
if argument:match (type_nombre)
then
test_quantieme = true
quantieme = argument:match (type_nombre)
position = string.find (argument, quantieme)
if position
then
if position == 1
then
chaine=string.sub (argument, string.len(quantieme)+1)
else
chaine1=string.sub (argument, 1, position-1)
chaine2=string.sub (argument, string.len(quantieme)+1)
chaine = chaine1..' '..chaine2
end
argument=chaine
end
end
-- Si la chaîne analysée est vide, le traitement est terminé
argument=trim(argument)
if argument
then
-- On vérifie si la chaîne qui reste est une année sous la forme "an XX"
argument = trim(argument)
if argument:match (type_an_republicain)
then
test_an = true
an = argument:match (type_romains)
else
-- On vérifie si la chaîne qui reste est une année sous la forme "XX"
if argument:match (type_romains)
then
test_an = true
an = argument:match (type_romains)
else
-- La chaîne qui reste n'est pas sous un format attendu, message d'erreur
erreur = true
message = ('format de date incorrect'..argument)
end
end
end
return(message)
end
-- Mise en forme de l'année affichée ; le paramètre en entrée doit être sous la forme "XX"
function p.annee_affichee(annee)
local chaine = ''
if annee
then
-- Vérification de la syntaxe en chiffres romains
if annee:match (type_romains)
then
-- Cas particulier de l'an I
if annee == 'I'
then
chaine = '[[An I du calendrier républicain|<span class="nowrap">an <abbr class="abbr" title="1">I</abbr></span>]]'
else
-- Vérification que l'année est bien une de celles lors desquelles le calendrier républicain était en vigueur
if listeRomains[annee]
then
chaine = '[[An '..annee..'|<span class="nowrap">an <abbr class="abbr" title="'..listeRomains[annee]..'">'..annee..'</abbr></span>]]'
else
erreur = true
return ("année hors du calendrier républicain")
end
end
return chaine
else
erreur = true
return ("format de l'année républicaine incorrect (chiffres romains)")
end
else
erreur = true
return ("année inexistante")
end
end
function p.date_republicaine (frame)
local args = Outils.extractArgs( frame )
local parametres = ''
for i = 1, 4 do
if args[i]
then
if (args[i] == 'Conversion') or (args[i] == 'conversion')
then
test_conversion = true
else
parametres = parametres..args[i]..' '
end
end
end
if parametres
then
message = p.test_argument (parametres)
else
message = 'aucun paramètre transmis'
erreur = true
end
if erreur
then
return(message)
end
local date_affichee = ''
local span_ouvert = false
if test_quantieme and not(test_mois)
then
return ('date invalide, mois manquant')
else
if not test_an
then
if test_quantieme
then
jour = quantieme
jour_affiche = quantieme
if jour == '1'
then
jour = '1er'
jour_affiche = '<abbr class="abbr" title="Premier" >1<sup>er</sup></abbr>'
end
if not jour then
erreur = true
return ('date invalide')
end
article = jour..' '..mois
if listeArticlesJours[article]
then
date_affichee = '<span class="nowrap">[['..jour..' '..mois..'|'..jour_affiche..']] [['..mois..']]</span>'
else
date_affichee = '<span class="nowrap">'..jour_affiche..' [['..mois..']]</span>'
end
else
date_affichee = '[['..mois..']]'
end
else
if test_quantieme and test_mois
then
date_affichee='<span class="nowrap">'
span_ouvert = true
jour = quantieme
jour_affiche = quantieme
if jour == '1'
then
jour = '1er'
jour_affiche = '<abbr class="abbr" title="Premier" >1<sup>er</sup></abbr>'
end
article = jour..' '..mois
if listeArticlesJours[article]
then
date_affichee = date_affichee..'[['..jour..' '..mois..'|'..jour_affiche..']] '
else
date_affichee = date_affichee..jour_affiche..' '
end
end
if test_mois
then
article = string.lower(mois)..' an '..an
if listeArticlesMois[article]
then
date_affichee = date_affichee..'[['..article..'|'..mois..']]'
else
date_affichee = date_affichee..'[['..mois..']] '
end
end
if span_ouvert
then
date_affichee = date_affichee..'</span> '
end
date_affichee = date_affichee..p.annee_affichee(an)
end
end
if test_conversion then
end
return (date_affichee)
end
return p