Aller au contenu

Module:Date républicaine

Cette page fait l’objet d’une mesure de semi-protection étendue.
Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 28 septembre 2017 à 22:03 et modifiée en dernier par Rehtse (discuter | contributions) (module de mise en forme des dates du calendrier républicain). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.
(diff) ← Version précédente | Version actuelle (diff) | Version suivante → (diff)

 Documentation[voir] [modifier] [historique] [purger]

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

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 :
    • sa mention simple permet l'affichage de la date grégorienne correspondante entre parenthèses, avec les liens (équivalent du modèle {{date}}),
    • sa mention avec « * » fait la même chose sans liens (équivalent du modèle {{date-}}) ;
  • 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
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