« Module:Date » : différence entre les versions
Aller à la navigation
Aller à la recherche
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 = | 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[ | 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 | if date:find( '[[', nil, true ) then | ||
date = date | |||
-- 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 | ||
date = date | |||
-- suppression balises | |||
:gsub( '%b<>', '' ) | |||
-- suppression des espaces insécables | |||
-- nbsp | |||
:gsub( '\194\160', ' ' ) | |||
:gsub( ' ', ' ' ) | |||
:gsub( ' ', ' ' ) | |||
-- narrow nbsp | |||
:gsub( '\226\128\175', ' ' ) | |||
:gsub( ' ', ' ' ) | |||
-- thin space | |||
:gsub( '\226\128\137', ' ' ) | |||
:gsub( ' ', ' ' ) | |||
:gsub( ' ', ' ' ) | |||
-- simple space | |||
:gsub( ' ', ' ' ) | |||
-- plusieurs espaces (doit être exécuté après les autres remplacements) | |||
: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 | 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 ~ | 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 | 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( | |||
RepSansLiens, | |||
{ 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 | ||
if annee < 0 then | if annee < 0 then | ||
local | local anneeAvJc = 0 - annee | ||
if args.avJC == false then | if args.avJC == false then | ||
texteAnnee = | texteAnnee = anneeAvJc | ||
else | else | ||
texteAnnee = | texteAnnee = anneeAvJc .. ' <abbr class="abbr" title="' | ||
.. | .. 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 ) | 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 | 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) | ||
-- | -- 2 : Date ou date de naissance | ||
-- | -- 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 | 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 | ||
an = tonumber( an ) | |||
mn = tonumber( mn ) | |||
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 | -- 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 | local y = 4716 | ||
local v = 3 | |||
local j = 1401 | |||
local u = 5 | |||
local m = 2 | |||
local s = 153 | |||
local n = 12 | |||
local w = 2 | |||
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 | ||