« Module:Date » : différence entre les versions

Aller à la navigation Aller à la recherche
6 291 octets ajoutés ,  8 février 2024
Module:Durée est utilisé uniquement dans la méthode dureeInfobox(), évitons donc de le charger dans toutes les invocations de Module:Date… (refs 206694507)
m (1 version importée)
(Module:Durée est utilisé uniquement dans la méthode dureeInfobox(), évitons donc de le charger dans toutes les invocations de Module:Date… (refs 206694507))
Ligne 1 : Ligne 1 :
-- luacheck: globals mw, no max line length
local fun = {}
local fun = {}


Ligne 72 : Ligne 74 :
local s = trim( saison )
local s = trim( saison )
if s then
if s then
s = mw.ustring.lower( s )
s = s:gsub( 'É', 'é' ):lower()
for i = 1, 4 do
for i = 1, 4 do
for j = 1, #liste_saisons[i] do
for j = 1, #liste_saisons[i] do
Ligne 98 : Ligne 100 :
result = listeMois[str]
result = listeMois[str]
if not result then
if not result then
result = listeMois[mw.ustring.lower( str )]
result = listeMois[str:gsub( 'É', 'é' ):gsub( 'Û', 'û' ):lower()]
end
end
end
end
Ligne 204 : Ligne 206 :
return erreur( 'Date', dateAvantCleanup )
return erreur( 'Date', dateAvantCleanup )
end
end
-- suppression catégorie, liens, balises
if date:find( '[[', nil, true ) then
date = mw.ustring.gsub( date, '%[%[[Cc]at[ée]gor[yi]e?:.-%]%]', '' )
date = date
date = date :gsub( '%b<>', '' )
-- suppression catégories (doit être exécuté avant le code de suppression des liens)
:gsub( '%[%[[Cc]atégorie:.-%]%]', '' )
:gsub( '%[%[[Cc]ategory:.-%]%]', '' )
-- suppression liens
:gsub( '%[%[([^%[%]|]*)|?([^%[%]]*)%]%]', function ( l, t ) return trim( t ) or l end )
:gsub( '%[%[([^%[%]|]*)|?([^%[%]]*)%]%]', function ( l, t ) return trim( t ) or l end )
-- suppression des espaces insécables
end
-- nbsp
date = date
:gsub( '\194\160', ' ' )
-- suppression balises
:gsub( '&nbsp;', ' ' )
:gsub( '%b<>', '' )
:gsub( '&#160;', ' ' )
-- suppression des espaces insécables
-- narrow nbsp
-- nbsp
:gsub( '\226\128\175', ' ' )
:gsub( '\194\160', ' ' )
:gsub( '&#8239;', ' ' )
:gsub( '&nbsp;', ' ' )
-- thin space
:gsub( '&#160;', ' ' )
:gsub( '\226\128\137', ' ' )
-- narrow nbsp
:gsub( '&thinsp;', ' ' )
:gsub( '\226\128\175', ' ' )
:gsub( '&#8201;', ' ' )
:gsub( '&#8239;', ' ' )
-- simple space
-- thin space
:gsub( '&#32;', ' ' )
:gsub( '\226\128\137', ' ' )
-- plusieurs espaces
:gsub( '&thinsp;', ' ' )
:gsub( ' +', ' ' )
:gsub( '&#8201;', ' ' )
-- réduction av. J-C pour simplifier un peu les regex :
-- simple space
:gsub( '(%d+) ?[Aa][Vv]%.? ?[Jj][ .-]*[Cc]%.?', '-%1' )
:gsub( '&#32;', ' ' )
-- suppression de l'heure dans les dates ISO
-- plusieurs espaces (doit être exécuté après les autres remplacements)
:gsub( '^+?([%d-]*%d%d%-%d%d)T%d%d[%d:,.+-]*Z?$' , '%1')
:gsub( ' +', ' ' )
-- réduction av. J-C pour simplifier un peu les regex
:gsub( '(%d+) ?[Aa][Vv]%.? ?[Jj][ .-]*[Cc]%.?', '-%1' )
-- suppression de l'heure dans les dates ISO
:gsub( '^+?([%d-]*%d%d%-%d%d)T%d%d[%d:,.+-]*Z?$' , '%1')


-- test année seule
-- test année seule
Ligne 328 : Ligne 337 :
if annee == nil and type( bannee ) == 'string' then
if annee == nil and type( bannee ) == 'string' then
-- test si l'année contient av. J.-C.
-- test si l'année contient av. J.-C.
annee = bannee:upper():match( '^(%d+) ?[Aa][Vv]%.? ?[Jj][ .-]*[Cc]%.?' )
annee = bannee:match( '^(%d+) ?[Aa][Vv]%.? ?[Jj][ .-]*[Cc]%.?' )
annee = tonumber( annee )
annee = tonumber( annee )
if annee then
if annee then
Ligne 441 : Ligne 450 :
-- âge : ajoute la durée depuis cette date
-- âge : ajoute la durée depuis cette date
-- agePrefix : préfixe pour l'age, 'à ' par défaut pour les décès
-- agePrefix : préfixe pour l'age, 'à ' par défaut pour les décès
-- nolinks : ne met pas de lien sur la date
-- liens : active les liens par défaut
-- nolinks : ne met pas de lien sur la date (a précédence sur le paramètre "liens")
-- afficherErreurs : en cas d'erreur, si défini à "non" ne retourne pas un message d'erreur, mais le 1er argument inchangé
-- afficherErreurs : en cas d'erreur, si défini à "non" ne retourne pas un message d'erreur, mais le 1er argument inchangé
-- categoriserErreurs : en cas d'erreur, si défini à "non" ne catégorise pas ; peut aussi être défini avec une catégorie à utiliser à la place de celle par défaut
-- categoriserErreurs : en cas d'erreur, si défini à "non" ne catégorise pas ; peut aussi être défini avec une catégorie à utiliser à la place de celle par défaut
Ligne 462 : Ligne 472 :
if test then
if test then
dateNaissanceMort = trim( arg2 )
dateNaissanceMort = trim( arg2 )
params.qualificatif = trim( arg2 )
if dataLiens[trim( arg2 )] then
params.qualificatif = trim( arg2 )
end
end
end
elseif type( arg1 ) == 'string' and type( arg2 ) == 'string' and arg3 ~= nil and arg4 == nil and ( arg1:match( '[^ ./-][ ./-]+[^ ./-]' ) or dataLiens[arg3] or mw.ustring.match( arg3, '%a %a' ) ) then
elseif type( arg1 ) == 'string' and type( arg2 ) == 'string' and arg3 ~= nil and ( arg1:match( '[^ ./-][ ./-]+[^ ./-]' ) or dataLiens[arg3] or mw.ustring.match( arg3, '%a %a' ) ) then
-- la date est dans le premier paramètre
-- la date est dans le premier paramètre
test, params = fun.separationJourMoisAnnee( arg1 )
test, params = fun.separationJourMoisAnnee( arg1 )
if test then
if test then
dateNaissanceMort = trim( arg2 )
dateNaissanceMort = trim( arg2 )
params.qualificatif = trim( arg3 )
if dataLiens[trim( arg3 )] then
params.qualificatif = trim( arg3 )
end
end
end
else
else
Ligne 483 : Ligne 497 :
cleanArgs[2], cleanArgs.masquerMois = masquerParam( args[2] or args.mois )
cleanArgs[2], cleanArgs.masquerMois = masquerParam( args[2] or args.mois )
cleanArgs[3], cleanArgs.masquerAnnee = masquerParam( args[3] or args.annee or args['année'] )
cleanArgs[3], cleanArgs.masquerAnnee = masquerParam( args[3] or args.annee or args['année'] )
-- Si les paramètres ont été envoyés directement, ils ont précédence
if args.masquerMois then cleanArgs.masquerMois = args.masquerMois end
if args.masquerAnnee then cleanArgs.masquerAnnee = args.masquerAnnee end


test, params = fun.validationJourMoisAnnee( cleanArgs )
test, params = fun.validationJourMoisAnnee( cleanArgs )
if test then
if test and dataLiens[trim( args[4] )] then
params.qualificatif = trim( args[4] )
params.qualificatif = trim( args[4] )
end
end
Ligne 493 : Ligne 511 :
if test then
if test then
params.agePrefix = args.agePrefix
params.agePrefix = args.agePrefix
if args.qualificatif and args.qualificatif ~= '' then
if args.qualificatif and dataLiens[args.qualificatif] then
params.qualificatif = args.qualificatif
params.qualificatif = args.qualificatif
end
end
Ligne 513 : Ligne 531 :
dateNaissanceMort = args.dateNaissanceMort
dateNaissanceMort = args.dateNaissanceMort
elseif args['dateNaissanceÉvénement'] and args['dateNaissanceÉvénement'] ~= '' then
elseif args['dateNaissanceÉvénement'] and args['dateNaissanceÉvénement'] ~= '' then
dateNaissanceMort = args['dateNaissanceÉvénement']  
dateNaissanceMort = args['dateNaissanceÉvénement']
end
end
if dateNaissanceMort then
if dateNaissanceMort then
Ligne 537 : Ligne 555 :
for n, v in pairs( listeParam ) do
for n, v in pairs( listeParam ) do
params[v] = params[v] or Yesno( args[n], true, false ) or nil
params[v] = params[v] or Yesno( args[n], true, false ) or nil
end
if not params.nolinks then
local liens = Yesno( args.liens )
if liens == nil then
-- liens actifs par défaut si qualificatif
liens = params.qualificatif and params.qualificatif ~= "" and true or false
end
params.nolinks = not liens
end
end


Ligne 611 : Ligne 638 :
local julienDate, julienSup, julienSep              -- servira éventuellement à afficher la date selon le calendrier julien
local julienDate, julienSup, julienSep              -- servira éventuellement à afficher la date selon le calendrier julien
local gregAprMois, gregAprAn, gregFin              -- message de calendrier grégorien lorsque la date est selon le calendrier julien
local gregAprMois, gregAprAn, gregFin              -- message de calendrier grégorien lorsque la date est selon le calendrier julien
local dateRepublicaine
if annee and jour then
if annee and jour then
local amj = annee * 10000 + numMois * 100 + jour
local amj = annee * 10000 + numMois * 100 + jour
Ligne 655 : Ligne 683 :
RepSansLiens = true
RepSansLiens = true
end
end
dateRepublicaine = DateRep._date_republicaine(
dateRepublicaine = DateRep._date_republicaine(
RepSansLiens,
RepSansLiens,
{ fun.formatRepCal( fun.do_toRepCal{gannee, gmois, gjour} ) }
{ fun.formatRepCal( fun.do_toRepCal{gannee, gmois, gjour} ) }
)
)
end
end
else
else
Ligne 786 : Ligne 814 :
if not args.masquerAnnee then
if not args.masquerAnnee then
local texteAnnee = annee
local texteAnnee = annee
local lien
if annee < 0 then
if annee < 0 then
local annneeAvJc = 0 - annee
local anneeAvJc = 0 - annee
lien = lien or ( annneeAvJc .. ' av. J.-C.' )
if args.avJC == false then
if args.avJC == false then
texteAnnee = annneeAvJc
texteAnnee = anneeAvJc
else
else
texteAnnee = annneeAvJc .. ' <abbr class="abbr" title="'
texteAnnee = anneeAvJc .. ' <abbr class="abbr" title="'
.. annneeAvJc .. ' avant Jésus-Christ">av. J.-C.</abbr>'
.. anneeAvJc .. ' avant Jésus-Christ">av. J.-C.</abbr>'
end
end
elseif args.apJC then
elseif args.apJC then
Ligne 803 : Ligne 829 :
table.insert( wikiListe, texteAnnee )
table.insert( wikiListe, texteAnnee )
else
else
lien = existDate( dataQualificatif, annee ) or existDate( dataCat, annee ) or lien or annee
local lien = existDate( dataQualificatif, annee ) or existDate( dataCat, annee )
if not lien then
if annee < 0 then
local anneeAvJc = 0 - annee
lien = anneeAvJc .. ' av. J.-C.'
else
lien = annee
end
end
if mois and #wikiListe == 0 then
if mois and #wikiListe == 0 then
-- si le mois n'a pas de lien et n'est pas affiché avec le jour, il est affiché avec l'année.
-- si le mois n'a pas de lien et n'est pas affiché avec le jour, il est affiché avec l'année.
Ligne 877 : Ligne 911 :
wikiHtml:wikitext( gregFin )
wikiHtml:wikitext( gregFin )


if args.republicain then
if dateRepublicaine then
wikiHtml:wikitext( ' (', dateRepublicaine, ')' )
wikiHtml:wikitext( ' (', dateRepublicaine, ')' )
end
end
Ligne 892 : Ligne 926 :
end
end


-- isoJourMoisAnnee transforme une date iso en un tableau équivalent à celui retourné par separationJourMoisAnnee
local function isoJourMoisAnnee( dateiso )
if dateiso and dateiso:sub( 1, 2 ) == 'U-' then
dateiso = dateiso:sub( 2 )
end
local annee, mois, jour = dateiso:match( '^(%-?%d%d%d%d+)%-(%d+)%-(%d+)$' )
if not annee then
annee, mois = dateiso:match( '^(%-?%d%d%d%d+)%-(%d+)$' )
end
if not annee then
annee = dateiso:match( '^(%-?%d%d%d%d+)$' )
end
if annee and tonumber( annee ) <= 0 then
-- la date iso utilise une année 0
annee = tonumber( annee ) - 1
end
if not annee then
mois, jour = dateiso:match( '^(%d+)%-(%d+)$' )
end
return fun.validationJourMoisAnnee{ jour, mois, annee }
end
-- analyseDate sépare la date du contenu qui précède et suit, supprime les liens, et retourne si possible une table avec jour mois année
local function analyseDate( d )
if trim( d ) then
local datesMultiples = d:match( ' ou ' ) or d:match( '^[Ee]ntre ' ) or d:match( '<time.->.-<time.->' )
if datesMultiples then
return d
end
local approx = d:match( '^[Vv]ers ' ) or d:match( '^[Aa]près ' ) or d:match( '^[Aa]vant ' )
-- booléen qui indique que la date est approximative, empêchant l'affichage de l'âge ou de la durée
approx = approx and true or false
local analyse = d
-- s'il s'agit d'une date formattée avec {{date}}, on utilisera la valeur du datetime pour reconstruire la date
local dateiso = d:match( 'datetime="([U%d-]+)"' ) or d:match( '<time>(.-)</time>' )
local debut, strDate, fin
if dateiso then
-- supprime le formatage créé par {{date}}
debut, strDate, fin = analyse:match( '(.-)<time.->(.-)</time>(.*)' )
end
if not strDate then
-- sépare une date av. J.-C. du contenu qui suit
strDate, fin = analyse:match( '(.-%d av%. J%.%-C%.]*%-?)(.*)' )
end
if not strDate then
-- sépare la date (avec ses liens) d'une référence ou contenu commençant par un espace
strDate, fin = analyse:match( '(.-%d%d%d%]*%-?)([\127 ].+)' )
end
if not strDate then
-- sépare la date du contenu commençant par <br>
strDate, fin = analyse:match( '(.-%d%d%d%]*%-?)(<br ?/?>.+)' )
end
analyse = strDate or analyse
-- supprime les liens
analyse = analyse:gsub(
'%[%[([^%[%]|]*)|?([^%[%]]*)%]%]',
function ( l, t )
return trim( t ) or l
end
)
local t, r
if dateiso then
-- Si la date était formatée avec {{date}}, on la reconstruit à partir de la valeur de datetime
t, r = isoJourMoisAnnee( dateiso )
end
if t then
local tTexte, rTexte = fun.separationJourMoisAnnee( analyse )
if r.annee and r.jour then
local amj = r.annee * 10000 + r.numMois * 100 + r.jour
-- Les dates avant le 14 octobre 1582 sont dans le calendrier julien mais utilisent un datetime grégorien
local gregToJul = amj < 15821014
if not gregToJul and amj < 15821024 then
-- Entre le 14 et le 23 octobre, on ne peut pas différencier entre julien et grégorien sans comparer avec le texte
gregToJul = tTexte and rTexte.jour ~= r.jour
end
if gregToJul then
local jannee, jmois, jjour = fun.gregorianToJulian( r.annee, r.numMois, r.jour )
r = {
annee = jannee,
numMois = jmois,
mois = listeMois[jmois].nom,
jour = jjour
}
end
end
if tTexte then
-- On analyse le texte de la date pour repérer les dates partiellement masquées
-- Si seul le jour est affiché, separationJourMoisAnnee l'interprète comme une année
if not rTexte.jour and not rTexte.mois and rTexte.annee == r.jour then
r.masquerMois = true
r.masquerAnnee = true
elseif rTexte.jour == r.jour and rTexte.mois == r.mois and not rTexte.annee then
r.masquerAnnee = true
end
end
else
t, r = fun.separationJourMoisAnnee( analyse )
end
if t then
return r, fin, debut, approx
else
return d, fin, debut, approx
end
end
end


---
---
Ligne 899 : Ligne 1 041 :
-- Paramètres :
-- Paramètres :
-- 1 : type de date à afficher (naissance / n, mort / m, ou date / d)
-- 1 : type de date à afficher (naissance / n, mort / m, ou date / d)
-- 1 : Date ou date de naissance
-- 2 : Date ou date de naissance
-- 2 : Date de mort si type n ou m
-- 3 : Date de mort si type n ou m
-- qualificatif = suffixe des page de date à lier (exemple : en musique)
-- qualificatif = suffixe des page de date à lier (exemple : en musique)
-- nolinks : n'affiche pas de lien
-- nolinks : n'affiche pas de lien
Ligne 909 : Ligne 1 051 :
if type( args ) ~= 'table' or not ( args[1] and args[2] ) then
if type( args ) ~= 'table' or not ( args[1] and args[2] ) then
return
return
end
-- analyseDate sépare la date du contenu qui suit, supprime les liens, et retourne si possible une table avec jour mois année
local function analyseDate( d )
if trim( d ) then
local analyse = d:match( ' ou ') or d:match( 'entre ' ) or d:match( 'vers ' ) or d:match( 'après ' ) or d:match( 'avant ' )
if analyse then
return d
end
analyse = d:match( 'datetime="([%d-]+)"' ) or d
-- sépare la date (avec ses liens) d'une référence ou contenu commençant par un espace)
local debut, fin = analyse:match( '(.-%d%d%d%]*%-?)([\127 ].+)' )
if not debut then
-- sépare la date du contenu commençant par <br>
debut, fin = analyse:match( '(.-%d%d%d%]*%-?)(<br ?/?>.+)' )
end
analyse = debut or analyse
-- supprime les liens
analyse = analyse:gsub(
'%[%[([^%[%]|]*)|?([^%[%]]*)%]%]',
function ( l, t )
return trim( t ) or l
end
)
local t, r = fun.separationJourMoisAnnee( analyse )
if t then
return r, fin
else
return d, fin
end
end
end
end
-- prefix ajoute un préfixe en fonction de la présence ou non du jour si le paramètre "préfixe sans jour" est défini
-- prefix ajoute un préfixe en fonction de la présence ou non du jour si le paramètre "préfixe sans jour" est défini
Ligne 959 : Ligne 1 070 :
local evenement = args[1]:match( '^é' )
local evenement = args[1]:match( '^é' )
local affichageDate, qualificatif = args[2], args[4]
local affichageDate, qualificatif = args[2], args[4]
local affichageDateTab, resultatDate, complementDate
local affichageDateTab, resultatDate, complementDate, prefixeDate, approxDate
local dateNaissance, dateMort
local dateNaissance, dateMort, approxNaissance, approxMort
if mort or evenement then
if mort or evenement then
affichageDate = args[3]
affichageDate = args[3]
Ligne 967 : Ligne 1 078 :
return
return
end
end
if affichageDate:match( '</time>' ) then
 
if affichageDate:match( ']]</time>' ) or affichageDate:match( '</time>]]' ) then
-- S'il y a des liens il y a probablement déjà un modèle date, évitons de l'exécuter une 2e fois
-- S'il y a des liens il y a probablement déjà un modèle date, évitons de l'exécuter une 2e fois
if ( naissance or mort or evenement ) and ( affichageDate:match( 'wikidata%-linkback' )) then
if ( naissance or mort or evenement ) and ( affichageDate:match( 'wikidata%-linkback' )) then
dateNaissance = analyseDate( args[2] )
local _
dateMort = analyseDate( args[3] )
dateNaissance, _, _, approxNaissance = analyseDate( args[2] )
dateMort, _, _, approxMort = analyseDate( args[3] )
resultatDate = affichageDate
resultatDate = affichageDate
else
else
Ligne 977 : Ligne 1 090 :
end
end
else
else
affichageDateTab, complementDate = analyseDate( affichageDate )
affichageDateTab, complementDate, prefixeDate, approxDate = analyseDate( affichageDate )
if type( affichageDateTab ) ~= 'table' then
if type( affichageDateTab ) ~= 'table' then
return affichageDateTab
return affichageDateTab
else
else
if naissance then
if naissance then
dateNaissance = affichageDateTab
local _
dateMort = analyseDate( args[3] )
dateNaissance, approxNaissance = affichageDateTab, approxDate
dateMort, _, _, approxMort = analyseDate( args[3] )
elseif mort then
elseif mort then
dateNaissance = analyseDate( args[2] )
local _
dateMort = affichageDateTab
dateNaissance, _, _, approxNaissance = analyseDate( args[2] )
dateMort, approxMort = affichageDateTab, approxDate
else
else
qualificatif = args[3]
qualificatif = args[3]
end
end
affichageDateTab.naissance = naissance
affichageDateTab.naissance = not approxNaissance and naissance
affichageDateTab.mort = mort
affichageDateTab.mort = not approxMort and mort
affichageDateTab.evenement = evenement
affichageDateTab.evenement = evenement
affichageDateTab.qualificatif = args.qualificatif or qualificatif
affichageDateTab.qualificatif = args.qualificatif or qualificatif
affichageDateTab.liens = true -- Dans les infobox, liens activés par défaut
affichageDateTab.nolinks = args.nolinks
affichageDateTab.nolinks = args.nolinks
affichageDateTab.nocat = args.nocat
affichageDateTab.nocat = args.nocat
Ligne 1 004 : Ligne 1 120 :
if naissance and
if naissance and
dateNaissance and
dateNaissance and
not approxNaissance and
not dateMort and
not dateMort and
type( dateNaissance ) == 'table'
type( dateNaissance ) == 'table'
Ligne 1 011 : Ligne 1 128 :
calculAge = nil
calculAge = nil
end
end
elseif (mort or evenement) and
elseif ( mort or evenement ) and
dateNaissance and
dateNaissance and
dateMort and
dateMort and
not approxNaissance and
not approxMort and
type( dateNaissance ) == 'table'
type( dateNaissance ) == 'table'
and type( dateMort ) == 'table'
and type( dateMort ) == 'table'
Ligne 1 041 : Ligne 1 160 :
end
end


return prefix( resultatDate ) .. ( complementDate or '' ) .. age
return ( prefixeDate or '' ) .. prefix( resultatDate ) .. ( complementDate or '' ) .. age
end
end


function fun.dureeInfobox( frame )
local args = frame.args
if type( args ) ~= 'table' or not args[1] then
return
end
-- vérifie si une chaîne semble contenir une durée
local function contientDuree( chaine )
return chaine and (
mw.ustring.match( chaine, '%f[%w]ans?%f[^%w]' ) or
mw.ustring.match( chaine, '%f[%w]mois%f[^%w]' ) or
mw.ustring.match( chaine, '%f[%w]jours?%f[^%w]' )
)
end
local jour1, mois1, annee1, jour2, mois2, annee2 = '', '', '', '', '', ''
local t1, fin1, _, approx1 = analyseDate( args[1] )
if approx1 or type( t1 ) ~= 'table' then
return
end
jour1 = t1.jour or ''
mois1 = t1.numMois or ''
annee1 = t1.annee or ''
if args[2] and args[2] ~= "" then
local t2, fin2, _, approx2 = analyseDate( args[2] )
if approx2 or type( t2 ) ~= 'table' then
return
end
if contientDuree( fin2 ) then
-- La durée semble déjà renseignée manuellement
return
end
jour2 = t2.jour or ''
mois2 = t2.numMois or ''
annee2 = t2.annee or ''
if annee1 == '' or annee2 == '' then
-- Mieux vaut ne pas extrapoler l'année
return
end
if ( jour1 ~= '' and jour2 == '' ) or
( mois1 ~= '' and mois2 == '' ) then
-- Si la deuxième date est moins précise que la première, mieux vaut ne rien afficher
return
end
elseif annee1 == '' or contientDuree( fin1 ) then
-- L'année n'est pas spécifiée ou la durée semble déjà renseignée
return
end
local duree = (require 'Module:Durée')._duree({ jour1, mois1, annee1, jour2, mois2, annee2, noerror = true })
if duree then
return '<br /><small>(' .. duree .. ')</small>'
end
end


---
---
Ligne 1 203 : Ligne 1 375 :
end
end


local an = tonumber( an )
an = tonumber( an )
local mn = tonumber( mn )
mn = tonumber( mn )
local jn = tonumber( jn )
jn = tonumber( jn )


if an == nil or ac == nil or mn == nil or mc == nil then
if an == nil or ac == nil or mn == nil or mc == nil then
Ligne 1 291 : Ligne 1 463 :
---
---
-- calcul d'une date dans le calendrier julien à partir du jour julien
-- calcul d'une date dans le calendrier julien à partir du jour julien
-- calcul basé sur l'algorithme de la page fr.wikipedia.org/wiki/Jour_julien (1/10/2013)
-- calcul basé sur l'algorithme de la page https://en.wikipedia.org/wiki/Julian_day#Julian_or_Gregorian_calendar_from_Julian_day_number
function fun.julianDayToJulian( julianDay )
function fun.julianDayToJulian( julianDay )
local year = math.modf( ( julianDay * 4 - 6884469 ) / 1461 )
local y = 4716
local r2 = julianDay - math.modf( ( 1461 * year + 6884472 ) / 4 )
local v = 3
local month = math.modf( ( 5 * r2 + 461 ) / 153 )
local j = 1401
local day = r2 - math.modf( ( 153 * month - 457 ) / 5 ) + 1
local u = 5
if month > 12 then
local m = 2
year = year + 1
local s = 153
month = month - 12
local n = 12
end
local w = 2
return year, month, day
local r = 4
local B = 274277
local p = 1461
local C = -38
local f = julianDay + j
local e = r * f + v
    local g = math.modf( math.fmod( e, p ) / r )
    local h = u * g + w
    local D = math.modf( math.fmod( h, s ) / u ) + 1
    local M = math.fmod( math.modf( h / s ) + m, n ) + 1
    local Y = math.modf( e / p ) - y + math.modf( ( n + m - M ) / n )
    return Y, M, D
end
end


Utilisateur anonyme

Menu de navigation