Changes
inscriptionDate : bug "Jour invalide"
-- liste des mois, écriture exacte et simplifiée, en minusculelocal liste_mois ={ { "janvier", "jan.", "janv.", "jan", "janv", "january", nJour =31 }, { "février", "fevrier", "fev.", "fev", "fév.", "fév", "february", nJour =29 }, { "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 },-- === Dependencies ===================== { "octobre", "oct.", "oct", "october", nJour =31 },-- ====================================== { "novembre", "nov.", "nov", "november", nJour =30 },local i18n = require('Module:I18n/date') -- get localized translations of date formatslocal Fallback { "décembre", "decembre", "déc.", "dec.", "dec", "déc", "december", nJour = require('Module:Fallback') -- get fallback functions31 },local yesno = require('Module:Yesno')}
end
---
-- valide que la chaîne passée est un mois valide.
-- retourne le nom complet ou nil si non reconnu
-- si reconnu, retourne aussi le numéro du mois [1-12]
function fun.valideSaison( saison )
if type( saison ) ~= "string" then
return nil
end
local m = mw.ustring.lower( mw.text.trim( saison ) )
for i = 1, 4 do
local j = 1
while liste_saison[i][j] ~= nil do
if liste_saison[i][j] == m then
return liste_saison[i][1]
end
j = j + 1
end
end
-- pas trouvé = return nil
end
----- determinationMois trouve le numéro du mois et son nom,-- à partir de son nom, de son numéro ou d'une expression mathématique.-- Si le deuxième paramètre est vrai, les nombres supérieur à 12 ou non entiers sont acceptés. function pfun._DatedeterminationMois(datevecmois, langmod, case, class, trim_yearboucle ) -- make sure inputs are in the right formatlocal num, nom if #datevec<6 tonumber( mois ) then for inum =#datevecmath.floor( tonumber( mois ) ) if mod then -- si le nombre du mois est calculé par une exression,6le résultat peut être supérieur à 12,ou inférieur à 1 do datevec[i] num =math.fmod( num + 239, 12 ) + 1 -- +239 car fmod(-1) = -1 et non 11 elseif num < 1 or num > 12 then num = nil end elseif trim( mois ) then nom, num = fun.valideMois( mois ) if nom == nil and boucle == nil then -- essai de détermination d'un nombre avec le parser #expr de Mediawiki. -- le paramètre boucle évite de tourner en boucle. nom, num = fun.determinationMois( mw.getCurrentFrame():callParserFunction( ' #expr', mois ), true, true ) end
end
if num and not case nom then case nom = '' endliste_mois[num][1] if not class then class = '' end if not trim_year then trim_year = '100-999' return nom, numend
end
if type( data ) ~= 'table' then
-- si data n'existe pas c'est que l'on considère qu'il n'y a pas de lien.
return
end
-- le qualificatif est remplacer par celui de la base de donnée, ce qui permet des alias.
local lien = annee .. ' ' .. ( dataQualificatif.qualificatif or '' )
local seul = annee
if mois then
lien = mois .. ' ' .. lien
seul = ucfirst( mois ) .. ' ' .. annee
end
local aucun = tonumber( data.aucun )
if aucun and annee <= aucun then
-- si la l'année est dans la partie 'aucun' on teste s'il y a malgré tout un lien isolé
if type( data.seul ) == 'table' then
for i, v in ipairs( data.seul ) do
if seul == v or seul == tonumber( v ) then
return lien
end
end
end
-- partie aucun et pas de lien => nil
return nil
elseif type( data.tous ) == 'table' then
local tous1, tous2 = tonumber( data.tous[1] ), tonumber( data.tous[2] )
if tous1 and tous2 and annee >= tous1 and annee <= tous2 then
-- l'année est dans la partie 'tous' donc on retourne le lien
return lien
end
end
-- l'annee n'est ni dans la partie aucun, ni dans la partie tous donc il faut tester si la page existe.
cibleLien = mw.title.new( lien )
if cibleLien and cibleLien.exists then
return lien
end
end
---
-- Supprime le jour de la semaine, et "le" avant une date
function fun.nettoyageJour( jour )
if type( jour ) == 'string' then
local nomJour = { '[Ll]undi', '[Mm]ardi', '[Mm]ercredi', '[Jj]eudi', '[Vv]endredi',
'[Ss]amedi', '[Dd]imanche', '^ *[Ll]e' }
local premier = { '<abbr class="abbr" title="Premier" >1<sup>er</sup></abbr>', '1er' }
for i, v in ipairs( nomJour ) do
jour = jour:gsub( v, '' )
end
for i, v in ipairs( premier ) do
jour = jour:gsub( v, '1' )
end
jour = mw.text.trim( jour )
end
return jour
end
---
-- sépare une chaine date en un tabel contenant les champs jour, mois annee.
function fun.separationJourMoisAnnee( date, decalage, args )
date = trim( date )
if date then
local function erreur( periode, valeur )
return false, Outils.erreur( periode .. ' invalide (' .. valeur .. ')' )
end
decalage = decalage or 0
args = args or {}
date = fun.nettoyageJour( date )
local annee = string.match( date, '^%d%d%d%d?$' )
if annee then
return fun.validationJourMoisAnnee{ '', '', annee, args[2 + decalage], decalage = decalage }
end
-- test date au format jj-mm-aaaa
local j, m, a = string.match( date, '^([0-3]?%d)-([^ /-]+)-*(%d*[ AVJCavjc.-]*)$' )
if not m then
-- test date aux formats jj/mm/aaaa ou dd mmm aaaa
j, m, a = string.match( date, '^([0-3]?%d)[ /]+([^ /-]+)[ /]*(-?%d*[ AVJCavjc.-]*)$' )
end
if not m then
-- test date aux formats aaaa-mm-jj, aaaa/mm/jj et aaaa mmm jj
a, m, j = string.match( date, '^(-?%d%d*)[ /-]+([^ /-]+)[ /-]*([0-3]?%d?)$' )
end
if not m then
-- test date aux formats mm/aaaa ou mmm aaaa
m, a = string.match( date, '^([^ /-]+)-?[ /]*(-?%d*[ AVJCavjc.]*)$' )
end
if m then
if decalage < 0 then
decalage = decalage + 2
end
if tonumber( j ) and tonumber( j ) > 31 and tonumber( a ) and tonumber( a ) < 31 then
-- la date est au format aaaa/mm/jj
return fun.validationJourMoisAnnee{ a, m, j, args[2 + decalage], decalage = decalage }
else
return fun.validationJourMoisAnnee{ j, m, a, args[2 + decalage], decalage = decalage }
end
else
return erreur( 'Date', date )
end
else
return true, {}
end
end
---
-- separationJourMoisAnnee prend jusqu'a cinq paramètre et essaie de les séparer en jour, mois, annee et qualificatif
-- la date peut être dans le premier paramètre ou séparée dans les paramètre 1 à 3 ou 2 à 4.
-- Le qualificatif est cherché dans le paramètre suivant.
-- La fonction retourne true suivit d'une table avec la date en paramètres nommé (sans accent sur année)
-- ou false suivit d'un message d'erreur.
function fun.validationJourMoisAnnee( frame, ... )
local args = Outils.extractArgs( frame, ... )
local jour, mois, numMois, annee, qualificatif, erreur
args[1] = tostring( args[1] or args['jour'] or '' )
args[2] = tostring( args[2] or args['mois'] or '' )
args[3] = tostring( args[3] or args['annee'] or args['année'] or '')
args[4] = tostring( args[4] or '' )
end
local decalage = 0
-- si pas de jour mais que args[2] est un mois on décale tout et on
-- n'affiche pas l'année
local arg1, arg2, arg3 = trim( args[1] ), trim( args[2] ), trim( args[3] )
if arg1 == nil and arg2 and (fun.determinationMois( args[3] ) or arg2:match( '[^ /][ /-].*%d%d$' ) ) then
decalage = 1
elseif arg1 == nil and arg2 == nil and arg3 and
( fun.determinationMois( args[4] ) or arg3:match( '[^ /][ /-].*%d%d$' ) ) then
decalage = 2
elseif arg1 and arg1:match( '%d%d%d$' ) then
-- l'année est dans le premier paramètre
decalage = -2
elseif not tonumber( args[3] ) and
tonumber( args[2] ) and tonumber( args[2] ) > 12 and
fun.determinationMois( args[1] )
then
-- le mois est dans le premier paramètre et l'année dans le deuxième
decalage = -1
end
-- on traite l'année
local bannee = args[3 + decalage]
if Outils.notEmpty( bannee ) then
annee = tonumber( bannee )
if annee == nil and type( bannee ) == 'string' then
-- test si l'année contient av. J.-C.
annee = string.match( string.upper( bannee ), '^(%d+)%sAV%.?%s?J%.?%-?C' )
annee = tonumber( annee )
if annee then
annee = 0 - annee
elseif decalage == -2 then
return fun.separationJourMoisAnnee( bannee, decalage, args )
else
return erreur( 'Année', bannee )
end
end
else
annee = nil
end
-- on traite le mois
local bmois = args[2 + decalage]
if Outils.notEmpty( bmois ) then
mois, numMois = fun.determinationMois( bmois )
if mois == nil then
mois = fun.valideSaison( bmois )
if mois == nil then
if annee then
return erreur( 'Mois', bmois )
elseif type( dataLiens[ trim( bmois ) ] ) == 'table' then
-- le deuxième paramètre est un qualificatif, donc la date est dans le premier paramètre
local bjour = args[1 + decalage]
return fun.separationJourMoisAnnee( bjour, decalage, args )
else
return erreur( 'Mois ou qualificatif', bmois )
end
end
else
-- on traite le jour si présent
local bjour = args[1 + decalage]
if Outils.notEmpty( bjour ) then
jour = tonumber( bjour )
if jour == nil then
jour = tonumber( fun.nettoyageJour( bjour ) )
end
if jour == nil then
return erreur( 'Jour', bjour )
end
-- on valide que le jour est correct
if jour < 1 or jour > 31 then
return erreur( 'Jour', bjour )
elseif jour > liste_mois[numMois].nJour then
return erreur( 'Jour', bjour .. bmois )
-- l'année bisextile n'est pas testée pour accepter les dates juliennes.
end
else
-- S'il n'y a pas de jour on regarde si la première lettre du mois est en majuscule
if mw.ustring.match( bmois, '^%u' ) then
-- oui, on passe la première lettre en majuscule
mois = ucfirst( mois )
end
-- s'il n'y a pas d'année non plus on retourne le mois simple
end
end
elseif decalage > -1 then
-- on teste le jour si présent
local bjour = args[1 + decalage]
if Outils.notEmpty( bjour ) then
if annee then
return erreur( 'Mois', 'absent' )
else
bjour = fun.nettoyageJour( bjour )
jour = tonumber( bjour )
if jour then
if jour > 31 or jour < 1 then
annee = jour
jour = nil
else
return erreur( 'date', 'jour seul : ' .. bjour )
end
else
return fun.separationJourMoisAnnee( bjour, decalage, args )
end
end
end
end
-- on traite le champs optionnel
qualificatif = trim( args[4 + decalage] ) or args.qualificatif
local result = {
jour = jour,
mois = mois,
numMois = numMois,
annee = annee,
qualificatif = qualificatif,
decalage = decalage + ( args.decalage or 0 )
}
return true, result
end
---
-- émule le modèle {{m|Date}}.
-- Paramètres :
-- 1 : jour (numéro ou "1er"). optionnel, si absent pas de jour
-- 2 : mois (en toutes lettres)
-- 3 : année (nombre)
-- 4 : optionnel, spécialité de l'année
-- Comportement spécial ("truc à deux balles au lieu d'utiliser un
-- paramètre nommé du genre "sans année=oui"...") : si 1 est vide
-- mais que le reste est complet → on n'affiche pas l'année
function fun.modeleDate( frame )
local args = Outils.extractArgs( frame )
-- séparation des paramètres jour, mois et année si nécessaire
local test, resultat = fun.validationJourMoisAnnee( args )
if not test then
local namespaceCategorisation = { [0] = true, [4] = true, [10] = true, [14] = true, [100] = true }
if namespaceCategorisation[ mw.title.getCurrentTitle().namespace ] and
not Outils.notEmpty( args.nocat ) then
return resultat .. '[[Catégorie:Page utilisant le modèle date avec une syntaxe erronée]]'
else
return resultat
end
end
local annee, mois, numMois, jour = resultat.annee, resultat.mois, resultat.numMois, resultat.jour
local decalage, qualificatif = resultat.decalage, resultat.qualificatif
if ( annee or mois or jour ) == nil then
return
end
-- on traite l'age, naissance et mort
local age = trim( args['âge'] or args['age'] )
age = age and fun.age( annee, numMois, jour )
local naissance = trim( args.naissance )
local mort = trim( args.mort )
-- on traite le calendrier
local gannee, gmois, gjour = annee, numMois, jour -- date suivant le calendrier grégorien pour <time>
local jannee, jmois, jjour = annee, mois, jour -- servira éventuellement à a affiché la date selon le calendrier julien
local julien2, julien3 = nil, nil -- servira éventuellement à a affiché des parenthèses
local julien = trim( string.lower( args.julien or '' ) )
if annee and jour then
local amj = annee * 10000 + numMois * 100 + jour
if amj < 15821014 then
if annee > 0 then
gannee, gmois, gjour = fun.julianToGregorian( annee, numMois, jour )
else
-- calendrier grégorien proleptique avec année 0.
gannee, gmois, gjour = fun.julianToGregorian( annee + 1, numMois, jour )
end
elseif julien == 'oui' then
gannee, gmois, gjour = fun.julianToGregorian( annee, numMois, jour )
annee, mois, jour = gannee, liste_mois[gmois][1], gjour
end
else
if annee and annee < 0 then
gannee = gannee + 1
end
end
-- on génère le résultat
-- Déclarations des variables
local wikiListe = TableBuilder.new() -- reçois le texte affiché pour chaque paramètre
local iso = TableBuilder.new() -- reçois le format date ISO de ce paramètre
local dataQualificatif, dataCat
if not args.nolinks then
dataQualificatif = dataLiens[qualificatif or '']
if type( dataQualificatif ) ~= 'table' then
-- si le qualifiquatif n'est pas dans la base de donnée, on crée une table minimum,
-- qui imposera un test sur l'annee, mais considère qu'il n'y a pas de lien sur le jour ou le mois
dataQualificatif = { qualificatif = ' ' .. qualificatif, annee = { } }
end
dataCat = dataLiens[dataQualificatif.cat]
if type( dataCat ) ~= 'table' or dataCat == dataQualificatif then
dataCat = { qualificatif = '' }
end
end
local function wikiLien( lien, texte )
if lien == texte then
return '[[' .. texte .. ']]'
else
return '[[' .. lien .. '|' .. texte .. ']]'
end
end
-- Date julienne
if jjour ~= jour then
if jjour == 1 then
jjour = '<abbr class="abbr" title="premier">1<sup>er</sup></abbr>'
end
if jannee ~= annee then
julien3 = '(<abbr class=abbr title="selon le calendrier julien">' .. jjour .. ' ' .. jmois .. ' ' .. jannee .. '</abbr>)'
else
julien2 = '(<abbr class=abbr title="selon le calendrier julien">' .. jjour .. ' ' .. jmois .. '</abbr>)'
end
end
-- create datecode based on which variables are provided and check for out of bound valuesle jour si présent local maxval qualifJour = {9999, 12, 31, 23, 59, 60} -- max values for year, month, ... local c = {'Y', 'M', 'D', 'H', 'M', 'S'} local datecode = '' -- a string signifying which combination of variables was providedif jour then local datenum texteJour = {} -- date-time encoded as a vector = [year, month, ... , second] for i, v in ipairs( datevec ) dojour if v~=nil and v~='' args.nolinks then datecode = datecode .. c[i] datenum[i] = tonumber(v) if datenum[i]jour ==nil and i==2 1 then -- month is not a number -> check if it is a month name in English v jour = mw.language.new('en'):formatDate( <abbr class="nabbr", v) datenum[i] title= tonumber(v)"premier">1<sup>er</sup></abbr>'
end
wikiListe.insert( jour ) else qualifJour = dataQualificatif.jour and dataQualificatif.qualificatif or dataCat.jour and dataCat.qualificatif or '' local lien = jour .. ' ' .. mois .. ' ' .. qualifJour if datenum[i]jour ==nil or datenum[i]>maxval[i] 1 then -- Some numbers are out of range -jour = '1<sup> abort and return the empty stringer</sup>' return lien = '1er ' .. mois .. ''.. qualifJour
end
-- s'il n'y a pas de lien sur le mois, il sera affiché avec le jour.
wikiListe.insert( wikiLien( lien, jour ) )
wikiListe.insert( wikiLien( lien, jour .. ' '.. mois ) )
end
iso.insert( 1, string.sub( '0' .. gjour, -2 ) )
end
-- create time stamp string (for example 2000-02-20 02:20:20) based on which variables were providedle mois local timeStampif mois then if datecode #wikiListe == 'YMDHMS' 0 and ( annee == nil or decalage > 1 ) then return mois timeStamp = stringend if args.formatnolinks then if decalage < 2 then wikiListe.insert('%04i-%02i-%02i %02i:%02i:%02i'mois ) end else local lien if annee then lien = existDate( dataQualificatif, datenum[1]annee, datenum[2]mois ) or existDate( dataCat, datenum[3]annee, datenum[4], datenum[5], datenum[6] mois ) elseif datecode if lien == nil and qualificatif and qualifJour == 'YMDHM' then timeStamp = string.format('%04i -%02i-%02i %02i:%02itest nouveau test sans le qualificatif uniquement s', datenumil n'y a pas d'éphémérides pour ce qualificatif. lien = existDate( dataLiens[1''], datenum[2]annee, datenummois ) end end if lien or decalage == 2 then -- s'il y a un lien on retire le lien affichant 'jour mois' pour ajouter '[3], datenum[4mois annee|mois'], datenum[5] wikiListe.remove() elseif datecode:sub if decalage < 2 then wikiListe.insert(1wikiLien( lien,3mois )==) end else -- sinon on retire le lien affichant 'YMDjour' pour ne garder que le lien 'jour mois' then timeStamp = string wikiListe.formatremove('%04i#wikiListe -%02i-%02i', datenum[1], datenum[2], datenum[3] ) datecode = 'YMD' -- s'YMDil n'y avait pas je jour, la liste est vide mais ça ne pose pas de problème -- sauf si l'YMDHMS' and 'YMDHM' are the only supported format starting with 'YMD'. All others will be converted to 'YMDannée n'est pas affichée : elseif datecode if #wikiListe == 'YM' 0 and ( annee == nil or decalage > 0 ) then return mois end end timeStamp = end if gmois then iso.insert( 1, string.formatsub('%04i-%02i0'.. gmois, datenum[1], datenum[-2] ) ) end elseif datecode:subend if(1,1julien2 )then wikiListe.insert( julien2 ) end -- l'année if annee then local texteAnnee =annee local lien if annee < 0 then local annneeAvJc =0 - annee lien = lien or ( annneeAvJc .. 'Yav. J.-C.' then) timeStamp local avJC = trim( string.formatlower(args.avJC or '%04i', datenum[1] ) ) datecode if args.avJC == 'Ynon' then elseif datecode texteAnnee =annneeAvJc else texteAnnee = annneeAvJc .. 'M<abbr class="abbr" title="' .. annneeAvJc .. ' avant Jésus-Christ">av. J.-C.</abbr>' end end if args.nolinks then-- seulement si on doit l'affichée if decalage < 1 then wikiListe.insert( texteAnnee ) end timeStamp else lien = string.formatexistDate(dataQualificatif, annee ) or existDate( dataCat, annee ) or lien or annee if mois and #wikiListe == 0 then -- si le mois n'%04ia pas de lien et n'est pas affiché avec le jour, il est affiché avec l'année. texteAnnee = mois .. ' ' .. texteAnnee end if decalage < 1 then -%02i-%02iseulement si on doit l'affichée wikiListe.insert( wikiLien( lien, 2000, datenum[2], texteAnnee ) ) end end if gannee > 999 then iso.insert( 1 , gannee ) class = elseif gannee > -1 then iso.insert( 1, string.sub( '000' .. gannee , -4 ) ) elseif gannee > - date not complete 999 then -> no html formating or micro-tagging of date calendrier grégorien proleptique avec année 0. iso.insert( 1, 'U-' .. string.sub( '000' .. ( 0 - gannee ), -4 ) ) else iso.insert( 1, 'U' .. gannee ) end elseif datecode end if( julien3 ) then wikiListe.insert( julien3 ) end -- l'age if type( age ) == 'MDnumber' and age >= 0 and ( not naissance or age < 120 ) then timeStamp if age = string.format= 0 then age = '(moins d\'%04i-%02i-%02iun an)', 2000, datenum[2], datenum[3] elseif age == 1 then age = '(1 an)' class else age = '(' -- date not complete -> no html formating or micro-tagging of date string.. age .. ' ans)' end
else
end
-- compilation du résultat
local wikiTexte = wikiListe.concat( ' ' )
local isoTexte = iso.concat( '-' )
-- On ajoute un peu de sémantique.
local wikiHtml = mw.html.create( '' )
local dateHtml = wikiHtml:tag( 'time' )
:wikitext( wikiTexte )
if wikiTexte:match( ' ' ) then
dateHtml:addClass( 'nowrap' )
end
if isoTexte ~= wikiTexte then
dateHtml:attr( 'datetime', isoTexte )
end
if not args.nolinks then
dateHtml:addClass( 'date-lien' )
end
if naissance then
dateHtml:addClass( 'bday' )
elseif mort then
dateHtml:addClass( 'dday' )
end
if age then
wikiHtml:wikitext( ' ' )
:tag( 'span' )
:addClass( 'noprint')
:wikitext( age )
:done()
end
return tostring( wikiHtml )
end
-- special case of French and Gallic dates, which require different S'il y a des liens il y a probablement déjà un modèle date format for the 1st day of the month, évitons de l'exècuter une 2e fois if datenummort and args[3]==1 and args[2]:match(langDateForm=='fr-form' or langDateForm=='ga-form</time>') then langDateForm = langDateForm .. return args[3] elseif args[2]:match( '1</time>' -- ordinal form for the first day of the month) then return args[2]
end
end
if mort then if not dateM then return end local age = '' if dateN then local t1, tdateN = fun.separationJourMoisAnnee(casedateN ) local t2, tdateM =fun.separationJourMoisAnnee( dateM ) if t1 and t2 then local calcul = fun.age( tdateN.annee, tdateN.numMois, tdateN.jour, tdateM.annee, tdateM.numMois, tdateM.jour ) if calcul > 1 then age ='nom(à '.. calcul .. ' ans) ' elseif calcul == 1 then -- CAUTION: at the moment i18n.DateFormat uses age = ' (à un an)' elseif calcul == 0 then age = "xg(à moins d'un an)" only as month name end end end return fun.modeleDate{ dateM, but this might change and this operation does qualificatif, mort = '1', nolinks = nolinks, nocat = nocat } .. age else if not check trim( dateN ) then return end if naissance and dateM == nil then return fun.modeleDate{ dateN, qualificatif, age = 'xgoui' is in "" brackets or not, so if some language starts using naissance='xg1' in "" than this will not work for that language, nolinks = nolinks, nocat = nocat } dFormat else return fun.modeleDate{ dateN, qualificatif, naissance= dFormat:gsub("xg"naissance, "F");nolinks = nolinks, nocat = nocat } end
end
end
end
-- Another special case related to Thai solar calendarle format de date iso est défini suivant le calendrier grégorien. if lang==-- Avant l'thannée 1583 la date est calendrier est probablement du calendrier julien, -- donc autant s' abstenir. if annee and datenum[1]~= nil and datenum[1]<=1940 annee > 1582 then -- As of 2014 {{#time}} parser function did not resolve those cases properly -- See https://enlocal mois = Outils.wikipedianotEmpty( args.org/wiki/Thai_solar_calendar#New_year for referencemois, args.month ) -- Disable once https://bugzilla.wikimedianum mois trouve le numéro du mois, qu'il soit numérique ou texte, complet ou abrégé.org/show_bug.cgi?id local nomMois, numMois =66648 is fixedfun.determinationMois( mois ) if datecode=='Y' numMois then -- date is ambiguous datestr mois = '-' .. string.formatsub('%04i หรือ %04i0'.. numMois, datenum[1]+542-2 ) local jour = Outils.notEmpty( args.jour, args.day, datenumargs[1'quantième']+543 ) elseif datenum[2]< if type( jour ) =3 = 'string' then -- year is wrong (one too many) datestr jour = datestr:gsubtonumber( jour ) or tonumber( string.formatmatch (jour, '%04id+', datenum) ) end jour = tonumber( jour ) if jour and jour <= liste_mois[1numMois]+543), .nJour then jour = '-' .. string.formatsub('%04i0'.. jour, datenum[1]+542 -2 ) return annee .. mois .. jour else return annee .. mois end else return tostring( annee )
end
end
end
---
-- Rang du jour dans l'année
-- Usage : do_dayRank{année,mois,jour}
function fun.do_dayRank(arguments)
local yr = tonumber(arguments.year or arguments[1]) or 1
local mt = tonumber(arguments.month or arguments[2]) or 1
local dy = tonumber(arguments.day or arguments[3]) or 1
-- Rangs des premiers des mois
local ranks = {0,31,59,90,120,151,181,212,243,273,304,334}
end
end
return result
end
-- Conversion et affichage d'une date dans le calendrier républicain
function fun.dateRepublicain(frame)
local pframe = frame:getParent()
local arguments = pframe.args
return fun.formatRepCal(fun.do_toRepCal(arguments))
end
---
-- Calcul d'une date dans le calendrier républicain
-- On suppose que les années 4n+3 sont sextiles (3, 7, 11...)
function fun.do_toRepCal(arguments)
local yr = tonumber(arguments.year or arguments[1]) or 2000
-- rang absolu du jour demandé, le jour 0 étant le 22 septembre 1792 (1er jour de l'an I)
local repDays = fun.do_dayRank(arguments) + fun.do_daysBetween{1792,yr} - fun.do_dayRank{1792,9,22}
local repYear = math.floor((repDays+731)/365.25) - 1
local repDayRank = repDays - 365*(repYear-1) - math.floor(repYear/4)
local repMonth, repDay = math.floor(repDayRank/30)+1, (repDayRank%30)+1
return {repYear, repMonth, repDay}
end
---
-- Formatage d'une date selon le calendrier républicain
-- Usage : fun.formatRepCal{année,mois,jour}
function fun.formatRepCal(arguments)
local months = {"Vendémiaire","Brumaire","Frimaire","Nivôse","Pluviôse","Ventôse","Germinal","Floréal","Prairial","Messidor","Thermidor","Fructidor"}
local extras = {"de la vertu","du génie","du travail","des récompenses","de l'opinion","de la révolution"}
local result = ""
if(arguments[2] < 13) then
result = result .. tostring(arguments[3]) .. " " .. months[arguments[2]]
else
result = result .. "jour " .. extras[arguments[3]]
end
result = result .. " de l'an " .. fun.toRoman(arguments[1])
return result
end
---
-- Voir Modèle:Âge
-- retourne l'age en fonction de la ou les dates fournies. La valeur retounée est de type 'number'
-- Parammètres :
-- 1, 2, 3 : année, mois jour de naissance (supposé dans le calendrier grégorien)
-- 4, 5, 6 : année, mois, joue du calcul (facultatif, par défaut la date UTC courante).
function fun.age( an, mn, jn, ac, mc, jc )
local an = tonumber( an )
if an == nil then
-- pas de message d'erreur qui risque de faire planter la fonction appelante
-- à elle de gérer ce retour.
return
end
-- les jours et mois sont par défaut égal à 1, pour pouvoir calculer un age même si la date est incompète.
local mn = tonumber( mn ) or 1
local jn = tonumber( jn ) or 1
else
end
end
end
end
return table.concat( wikiList )end -- html formating and tagging of date string[[ if class ~= Cette fonction retourne "CET" ou "CEST" selon que dans la pseudo-timezone en cours c'est l' thenheure d'été ou l'heure d'hiver. local DateHtmlTags = Cette fonction n'<span stylea de sens a priori que pour des modèles utilisés en Europe Paramètre optionnel non nommé : "sans lien" : retourne le texte CET/CEST. sinon retourne ce même texte avec un wikilien vers les articles correspondant--]]function fun.CEST(frame) -- option : ne pas créer de wikilien local opt =mw.text.trim(frame.args[1] or frame:getParent().args[1] or "white") -space- on récupère l'information dans la zone courante local t = mw.getContentLanguage():nowrapformatDate("><time classI", nil, true) if (t =="%s1" datetime) then -- heure d'été if (opt =="%ssans lien">%) then return "CEST" elseif (opt == "décalage") then return "2" else return "[[Heure d'été d'Europe centrale|CEST]]" end else -- heure d'hiver (ou autre zone où ça ne s</time></span>'applique pas) datestr if (opt = DateHtmlTags:format= "sans lien") then return "CET" elseif (class, timeStamp, datestropt == "décalage")then return "1" else return "[[Heure normale d'Europe centrale|CET]]" end
end
end
return pfun
Anonymous user