Ouvrir le menu principal

Modifications

1 973 octets ajoutés ,  5 mai 2020 à 18:03
m
1 révision importée
local Outils = require 'Module:Outils'
-- chargement de la base de donnée données répertoriant certaines pages existant ou n'existant pas pour éviter les "ifexist".
local dataLiens
local success, resultat = pcall ( mw.loadData, 'Module:Date/Data' )
dataLiens = resultat
else
-- protection au cas ou le sous -module serait mal modifié
dataLiens = { [''] = { mois = { aucun = 1000, tous = { 1773, 2014 } }, } }
end
-- nettoie un paramètre non nommé (vire les espaces au début et à la fin)
-- retourne nil si le texte est vide ou n'est pas du texte. Attention c'est important pour les fonction fonctions qui l'utiliseutilisent.
local trim = Outils.trim
-- Fonction destiné destinée à mettre la première lettre du mois en majuscule du mois : -- utilisation de string car aucun mois ne commance commence par une lettre non ascii en français ou anglais.
local function ucfirst( str )
return str:sub( 1, 1 ):upper() .. str:sub( 2 )
{ num = 11, nJour = 30, abrev = 'nov.', nom = 'novembre', alias = { 'nov.', 'nov', 'november' } },
{ num = 12, nJour = 31, abrev = 'déc.', nom = 'décembre', alias = { 'decembre', 'déc.', 'dec.', 'dec', 'déc', 'december' } },
aout = { num = 8, nJour = 31, abrev = 'aout', nom = 'aout', alias = { 'aou' } },
}
-- ajoute les noms, abreviations abréviations et alias en tant que clé clés de listeMois
for i = 1, 12 do
local mois = listeMois[ i ] listeMois[ tostring( i ) ] = mois if i < 10 then listeMois[ '0' .. i ] = mois end listeMois[ mois.nom ] = mois listeMois[ mois.abrev ] = mois
for _, n in ipairs( mois.alias ) do
listeMois[ n ] = mois
end
end
for _, n in ipairs( listeMois.aout.alias ) do
listeMois[ n ] = listeMois.aout
end
fun.listeMois = listeMois
local liste_saisons = {
}
----- valide que la chaîne passée est à partir d'un mois valide.-- retourne le nom complet de saison (en français ou nil si non reconnuen anglais),-- si reconnu, retourne aussi le numéro du mois [1-12]function fun.valideMoisson nom canonique ( mois exemple : "été") local m = trim( mois ) if m then m = mw.ustring.lower( m ) if listeMois[ m ] then return listeMois[ m ].nom, listeMois[ m ].num end endend ----- valide que la chaîne passée est une saison valide.-- retourne le nom complet ou nil si non reconnu, retourne nilfunction fun.valideSaisondeterminationSaison( saison )
local s = trim( saison )
if s then
---
-- determinationMois trouve le numéro du mois et son nom,-- à partir d'un nom de son nommois (en français ou en anglais), de son numéro ou d'une expression mathématique.abréviation,-- retourne son nom canonique (exemple : "juin") et son numéro (exemple : 6)-- Si le deuxième paramètre est vraisi non reconnu, retourne nil, les nombres supérieur à 12 ou non entiers sont acceptés. nilfunction fun.determinationMois( mois, mod, boucle ) local num, nomresult  if tonumber( mois ) then local num = math.floor( tonumber( mois ) ) if mod num then -- si le nombre du mois est calculé par une exression, le résultat peut être supérieur à 12, ou inférieur à 1 num result = math.fmod( num + 239, 12 ) + 1 -- +239 car fmod(-1) = -1 et non 11 elseif num < 1 or num > 12 then listeMois[num = nil end] elseif trim( mois ) thenelse nom, num local str = fun.valideMoistrim( mois ) if nom == nil and boucle == nil str then -- essai de détermination d'un nombre avec le parser #expr de Mediawiki.result = listeMois[str] -- le paramètre boucle évite de tourner en boucle.if not result then nom, num result = funlisteMois[mw.determinationMois( mwustring.getCurrentFramelower(str ):callParserFunction( '#expr', mois ), true, true )] end
end
end
  if num and not nom result then return result.nom = listeMois[ , result.num ].nom else return nil, nil
end
return nom, num
end
-- fonction interne à modeleDate, pour déterminer si on peut se passer de faire un ifexitifexist
local function existDate( dataQualificatif, annee, mois )
local data
return
end
-- le qualificatif est remplacer remplacé par celui de la base de donnéedonnées, ce qui permet des alias. local lien = annee
if dataQualificatif.qualificatif then
lien = lien .. ' ' .. dataQualificatif.qualificatif
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
end
end
-- l'annee année n'est ni dans la partie aucun, ni dans la partie tous donc il faut tester si la page existe.
local cibleLien = mw.title.new( lien )
if cibleLien and cibleLien.exists 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="[Pp]remier" ?>1<sup>er</sup></abbr>', '1<sup>er</sup>', '1er' }
for i, v in ipairs( nomJour ) do
jour = jour:gsub( v, '' )
---
-- Sépare une chaine date en un une table contenant les champs jour, mois et annee.
-- la date doit contenir le mois.
function fun.separationJourMoisAnnee( date )
local jour, mois, annee, masquerMois, masquerAnnee, separateur
-- variable pour construire les regex
local j = '([0-3]?%d)' -- jour local m = '([01]?%d)' -- mois numérique local mmm = '([^%s%p%d]+[.]?)' -- mois en toute lettre local mmm2 = '([^%s%p%d]+[.]?[-/][^%s%p%d]+[.]?)' -- mois- mois en toute lettre local aj = '(%-?%d+)' -- année ou jour local s = '[ ./-]+' -- séparateur simple local sep = '([ ./-]+)' -- séparateur avec capture, pour le détecter deux fois local moins = '(%-?)' -- signe moins pour signifier qu'il ne faut pas afficher cette donnée local regexb = { jmmm = '^'..j..s..mmm..moins..'$', mmmjva = '^'..mmm..s..j..', ?'..aj..'$', }
date = fun.nettoyageJour( date )
-- suppression catégorie, liens, balises
date = mw.ustring.gsub( date, '%[%[[Cc]at[ée]gor[yi]e?:.-%]%]', '' )
date = date :gsub( '%b<>', '' )
:gsub( '%[%[([^%[%]|]*)|?([^%[%]]*)%]%]', function ( l, t ) return trim( t ) or l end )
-- réduction av. J-C pour simplifier un peu les regex :
:gsub( '(%d+) ?[Aa][Vv]%.? ?[Jj][ .-]*[Cc]%.?', '-%1' )
-- supression suppression de l'heure dans les date dates ISO
:gsub( '^+?([%d-]*%d%d%-%d%d)T%d%d[%d:,.+-]*Z?$' , '%1')
-- test année seule
if date:match( '^'..aj..'$' ) then
annee = date:match( '^'..aj..'$' )
elseif date:match( '^'..aj..s..aj..moins..'$' ) then
-- jj/mm, mm/aaaa ou aaaa/mm
local a, separateur, b, sb = date:match( '^'..aj..sep..aj..moins..'$' )
a, b = tonumber( a ), tonumber( b )
return erreur( 'Date', date )
elseif b < 1 or b > 31 then
mois, annee, masquerAnnee = a, b, sb
elseif a < 1 or a > 31 then
annee, mois = a, b
elseif b > 12 then
return erreur( 'Mois', b )
elseif date:match( '^'..aj..sep..m..moins..'%2'..aj..moins..'$' ) then
-- jj/mm/aaaa ou aaaa/mm/jj
jour, separateur, mois, masquerMois, annee, masquerAnnee = date:match( '^'..aj..sep..m..moins..'%2'..aj..moins..'$' )
if separateur == '-' and masquerMois == '-' and masquerAnnee == '' and tonumber( annee ) > 0 then
-- date au format jj-mm--aaaa type 17-06--44 pour 17 juin 44 av. JC
-- mmm aaaa
mois, separateur, annee, masquerAnnee = date:match( '^'..mmm..sep..aj..moins..'$' )
if separateur:match( '^.+%-$' ) then
annee = '-' .. annee
end
elseif date:match( '^'..mmm2..s..aj..moins..'$' ) then
-- mmm-mmm aaaa
mois, separateur, annee, masquerAnnee = date:match( '^'..mmm2..sep..aj..moins..'$' )
if separateur:match( '^.+%-$' ) then
annee = '-' .. annee
end
elseif date:match( '^'..j..s..mmm..moins..'$' ) then
-- jj mmmmmmm
jour, mois, masquerMois = date:match( '^'..j..s..mmm..moins..'$' )
elseif date:match( '^'..mmm..s..j..', ?'..aj..'$') then
jour = temp
end
return fun.validationJourMoisAnnee{ jour, mois, annee, masquerAnnee = trim( masquerAnnee ) and true or nil, masquerMois = ( trim( masquerAnnee ) or not annee ) and trim( masquerMois ) and true or nil,
-- or nil sert juste à éviter de trainer une valeur false dans tous les tests unitaires.
}
else
return true, {}
end
---
-- validationJourMoisAnnee vérifie que les paramètres correspondent à une date valide.-- la date peut être dans les paramètre paramètres 1 à 3, ou dans des paramètres jour, mois et annee.-- La fonction retourne true suivit suivi d'une table avec la date en paramètres nommé nommés (sans accent sur année)-- ou false suivit suivi d'un message d'erreur.function fun.validationJourMoisAnnee( frame, ... ) local args = Outils.extractArgs( frame, ... )
local jour, mois, numMois, annee
local bjour = args[1] or args['jour'] or ''
local bmois = tostring( args[2] or args['mois'] or '' )
local bannee = args[3] or args['annee'] or args['année'] or ''
local function erreur( periode, valeur )
return false, '<span class="error">' .. periode .. ' invalide (' .. valeur .. ')</span>'
end
-- on traite l'année
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.bannee:upper( bannee ), :match( '^(%d+) ?[Aa][Vv]%.? ?[Jj][ .-]*[Cc]%.?' )
annee = tonumber( annee )
if annee then
annee = nil
end
-- on traite le mois
if Outils.notEmpty( bmois ) then
mois, numMois = fun.determinationMois( bmois )
if mois == nil then
mois = fun.valideSaisondeterminationSaison( bmois )
if mois == nil then
local mois1, sep, mois2 = bmois:match( '^([^%s%p%d]+[.]?)([-/])([^%s%p%d]+[.]?)$' ) if mois1 then mois1 = fun.determinationMois( mois1 ) mois2 = fun.determinationMois( mois2 ) if mois1 == nil or mois2 == nil then return erreur( 'Mois', bmois ) end mois = mois1 .. sep .. mois2 else return erreur( 'Mois', bmois ) end end end -- on traite le jour si présent if Outils.notEmpty( bjour ) then if not numMois then erreur( 'Date', 'jour avec saison ou plusieurs mois' ) end 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 > listeMois[numMois].nJour then return erreur( 'Jour', bjour .. ' ' .. mois ) elseif jour == 29 and numMois == 2 and annee and ( math.fmod( annee, 4 ) ~= 0 ) then -- l'année bisextile sur les siècles est toujours acceptée pour être compatible avec les dates juliennes. return erreur( 'Jour', '29 février ' .. annee )
end
else -- on traite le jour si présent 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 > listeMois[numMois].nJour then return erreur( 'Jour', bjour .. ' ' .. mois ) elseif jour == 29 and numMois == 2 and annee and ( math.fmod( annee, 4 ) ~= 0 ) then -- l'année bisextile sur les siècles est toujours acceptée pour être compatible avec les dates juliennes. return erreur( 'Jour', '29 février ' .. annee ) end else -- S'il n'y a pas de jour on regarde si la première lettre du mois est en majuscule if bmois:match( '^%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
-- s'il n'y a pas d'année non plus on retourne le mois simple
end
else
end
end
end
end
-- vérification de l'absence d'un décalage
if annee and annee < 13 and annee > 0 and not jour and ( tonumber( bmois ) or (not mois and tonumber( args[4] ) ) ) then
return false, '<span class="error">année improbable (' .. annee .. ')</span>'
end
local resultat = {
jour = jour,
numMois = numMois,
annee = annee,
masquerAnnee = args.masquerAnnee,
masquerMois = args.masquerMois,
}
-- julien : date dans le calendrier julien
-- compact : affiche le mois sous forme d'abréviation
-- avJC : non pour désactiver l'affichage de « av. J.-C. » pour les date dates négatives-- âge : ajout ajoute la durée depuis cette date-- nolink nolinks : ne met pas de lien sur la date-- onerror : en cas d'erreur, valeur à retourner à la place du message d'erreur ; la valeur spéciale "input" fait retourner le 1er argument inchangé
-- naissance : ajoute la class "bday"
-- mort : ajoute la class "dday"
local args = Outils.extractArgs( frame )
local cat, resultat = ''
  local dateNaissanceMort 
-- analyse des paramètres non nommés (ou paramètres de la date jour, mois, annee)
local test, params
test, params = fun.separationJourMoisAnnee( arg1 )
if test then
dateNaissanceMort = trim( arg2 ) params.qualificatif = trim( arg2 ) 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 -- la date est dans le premier paramètre test, params = fun.separationJourMoisAnnee( arg1 ) if test then dateNaissanceMort = trim( arg2) params.qualificatif = trim( arg3 )
end
else
cleanArgs[2], cleanArgs.masquerMois = masquerParam( args[2] or args.mois )
cleanArgs[3], cleanArgs.masquerAnnee = masquerParam( args[3] or args.annee or args['annee'] )
test, params = fun.validationJourMoisAnnee( cleanArgs )
if test then
end
end
-- analyse des paramètres nommés
if test then
local Yesno = require 'Module:Yesno'
  paramsif args.qualificatif and args.qualificatif ~= '' then params.qualificatif or = args.qualificatif end  -- julien peut avoir trois valeurs: inactif, format standard (true), format court
params.julien = Yesno( args.julien, 'court', false )
params.avJC = Yesno( args.avJC )
  if args['républicain'] and args['républicain'] ~= '' then if args['républicain'] == 'liens' then params.republicain = 'liens' else params.republicain = Yesno( args['républicain'], false ) end else params.republicain = false end  if args.dateNaissanceMort and args.dateNaissanceMort ~= 'liens'then dateNaissanceMort = args.dateNaissanceMort end  if dateNaissanceMort then local testNaissanceMort, falseparamsNaissanceMort = fun.separationJourMoisAnnee( dateNaissanceMort ) if testNaissanceMort then params.anneeNaissanceMort, params.moisNaissanceMort, params.numMoisNaissanceMort, params.jourNaissanceMort = paramsNaissanceMort.annee, paramsNaissanceMort.mois, paramsNaissanceMort.numMois, paramsNaissanceMort.jour end end 
local listeParam = {
age = 'âge',
params[v] = params[v] or Yesno( args[n], true, false ) or nil
end
-- sortie pour les tests unitaire, ou pour débugerdébugger
if args.debug then
return params
end
resultat = fun._modeleDate( params )
 
elseif args.onerror then
if args.onerror == 'input' then
return args[1]
else
return args.onerror
end
else
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
cat = '[[Catégorie:Page utilisant le modèle date avec une syntaxe erronée]]'
end
resultat = params .. cat
end
return resultat or ''
end
local annee, mois, numMois, jour = args.annee, args.mois, args.numMois, args.jour
local qualificatif = args.qualificatif
if ( annee or mois or jour ) == nil then
return
end
-- on traite l'ageâge, naissance et mort local agePrefix = '' local age = args['âge'] and fun.age( annee, numMois, jour )
local naissance = args.naissance
local mort = args.mort
if mort and args.anneeNaissanceMort then age = fun.age( args.anneeNaissanceMort, args.numMoisNaissanceMort, args.jourNaissanceMort, annee, numMois, jour ) agePrefix = 'à ' end 
-- 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 -- date suivant le calendrier julien si necessaire
local julienDate, julienSup, julienSep -- servira éventuellement à a afficher la date selon le calendrier julien local gregAprMois, gregAprAn, gregFin -- message de calendrier gégorien grégorien lorsque la date est selon le calendrier julien
if annee and jour then
local amj = annee * 10000 + numMois * 100 + jour
end
args.julien = false
elseif args.julien then
gannee, gmois, gjour = fun.julianToGregorian( annee, numMois, jour )
end
if args.compact then
jmois = listeMois[ jmois ].abrev
end
if args.julien == 'court' then
gregFin = ' [[Passage du calendrier julien au calendrier grégorien|dans le calendrier grégorien]])'
end
elseif args.republicain then
local DateRep = require 'Module:Date républicaine'
local RepSansLiens
if args.republicain == 'liens' then
RepSansLiens = false
end
dateRepublicaine = DateRep._date_republicaine(
RepSansLiens,
{ fun.formatRepCal( fun.do_toRepCal{gannee, gmois, gjour} ) }
)
end
args.julien = false
args.republicain=false
end
-- on génère le résultat
-- Déclarations des variables
local wikiListe = {} -- reçois reçoit le texte affiché pour chaque paramètre local iso = {} -- reçois reçoit le format date ISO de ce paramètre
local texteMois = mois -- texte du mois qui sera affiché (éventuellement l'abréviation)
if args.compact then
if args.nolinks not numMois then texteMois = '<abbr class=abbr title="-- mois est autre chose qu' un simple mois : saison, mois-mois.. mois .. auquel cas, pas d'abréviation (provoquait erreur Lua) -- (les abréviations pour le cas ">' .. listeMoismois[ -/]mois ].abrev .. '</abbr>'" seraient théoriquement possibles, mais ça reste à implémenter)
else
if args.nolinks then texteMois = '<abbr class=abbr title="' .. mois .. '">' .. listeMois[mois].abrev .. '</abbr>' else texteMois = listeMois[ mois ].abrev end
end
end
mois = mois and mois:gsub( 'aout', 'août' )
local dataQualificatif, dataCat
if not args.nolinks then
dataQualificatif = dataLiens[qualificatif or '']
if type( dataQualificatif ) ~= 'table' then
-- si le qualifiquatif qualificatif n'est pas dans la base de donnéedonnées, on crée une table minimum, -- qui imposera un test sur l'anneeannée, mais considère qu'il n'y a pas de lien sur le jour ou le mois
dataQualificatif = { qualificatif = ' ' .. qualificatif, annee = { } }
end
end
local function wikiLien( lien, texte )
if lien == texte then
return '[[' .. texte .. ']]'
else
return '[[' .. lien .. '|' .. texte .. ']]'
end
end
-- le jour si présent
jour = modelePremier
end
table.insert( wikiListe, jour )
else
qualifJour = dataQualificatif.jour and dataQualificatif.qualificatif
end
-- s'il n'y a pas de lien sur le mois, il sera affiché avec le jour.
table.insert( wikiListe, wikiLien( lien, jour ) ) table.insert( wikiListe, wikiLien( lien, jour .. ' '.. texteMois ) )
end
table.insert( iso, 1, string.sub( '0' .. gjour, -2 ) )
end
-- le mois
if mois then
end
if args.nolinks then
if not args.masquerMois then table.insert( wikiListe, texteMois )
end
else
local lien
if annee then
if not numMois then -- mois est autre chose qu'un simple mois : saison, mois-mois... auquel cas, pas de lien else lien = existDate( dataQualificatif, annee, mois ) or existDate( dataCat, annee, mois ) if lien == nil and qualificatif and qualifJour == '' then -- test nouveau test sans le qualificatif uniquement s'il n'y a pas d'éphémérides pour ce qualificatif. lien = existDate( dataLiens[''], annee, mois ) end
end
end
table.remove( wikiListe )
if not args.masquerMois then
table.insert( wikiListe, wikiLien( lien, texteMois ) )
end
elseif #wikiListe > 0 then
elseif args.masquerAnnee then
-- s'il n'y a pas de jour et que l'année n'est pas affichée, on insère le mois seul.
table.insert( wikiListe, texteMois )
end
end
if gmois then
table.insert( iso, 1, string.sub( '0' .. gmois, -2 ) )
end
table.insert( wikiListe, gregAprMois )
end
-- l'année
if annee and not (args.julien == true and args.nolinks and jannee == annee ) then
.. texteAnnee .. ' après Jésus-Christ">apr. J.-C.</abbr>'
end
if args.nolinks then -- seulement si on doit l'affichéeafficher table.insert( wikiListe, texteAnnee )
else
lien = existDate( dataQualificatif, annee ) or existDate( dataCat, annee ) or lien or annee
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.
texteAnnee = texteMois .. ' ' .. texteAnnee
end
table.insert( wikiListe, wikiLien( lien, texteAnnee ) )
end
end
if annee then
if gannee > 999 then
table.insert( iso, 1, gannee )
elseif gannee > -1 then
table.insert( iso, 1, string.sub( '000' .. gannee , -4 ) )
elseif gannee > -999 then
-- calendrier grégorien proleptique avec année 0.
table.insert( iso, 1, 'U-' .. string.sub( '000' .. ( 0 - gannee ), -4 ) )
else
table.insert( iso, 1, 'U' .. gannee )
end
end
if type( age ) == 'number' and age >= 0 and ( not naissance or age < 120 ) then
if age == 0 then
age = '(' .. agePrefix .. 'moins d’un\194\160an)'
elseif age == 1 then
age = '(' .. agePrefix .. '1\194\160an)'
else
age = '(' .. agePrefix .. age .. '\194\160ans)'
end
else
age = false
end
-- compilation du résultat
local wikiTexte = table.concat( wikiListe, ' ' )
local isoTexte = table.concat( iso, '-' )
-- On ajoute un peu de sémantique.
local wikiHtml = mw.html.create( '' )
if julienDate then
wikiHtml:tag( 'span')
:addClass( 'nowrap' )
:attr( 'data-sort-value', isoTexte )
:wikitext( julienDate )
:node( julienSup )
:done()
:wikitext( julienSep )
end
local dateHtml = wikiHtml:tag( 'time' )
:wikitext( wikiTexte )
dateHtml:addClass( 'date-lien' )
end
if naissance then
dateHtml:addClass( 'bday' )
elseif mort then
dateHtml:addClass( 'dday' )
end
wikiHtml:wikitext( gregFin )
if args.republicain then
wikiHtml:wikitext( ' (', dateRepublicaine, ')' )
end
if age then
wikiHtml:wikitext( ' ' )
:done()
end
return tostring( wikiHtml )
end
---
-- fonction destinée aux infobox, notamment pour afficher les dates de naissance et de mort
-- les liens présent dans les dates fournies sont automatiquement supprimées supprimés pour gérer les cas ou
-- le paramètre contient déjà un modèle date.
-- Paramètres :
return
end
-- analyseDate sépare la date du contenu qui suit, supprime les liens, et retourne si possible un 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
end
analyse = debut or analyse
-- supprime les lienliens
analyse = analyse:gsub(
'%[%[([^%[%]|]*)|?([^%[%]]*)%]%]',
return dateString
end
local naissance = args[1]:match( '^n' ) == 'n'
local mort = args[1]:match( '^m' ) or args[1]:match( 'décès' )
end
if 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 exécuter une 2e fois if ( naissance or mort ) and ( affichageDate:match( 'wikidata%-linkback' )) then
dateNaissance = analyseDate( args[2] )
dateMort = analyseDate( args[3] )
resultatDate = affichageDate
else
return prefix( affichageDate )
end
else
affichageDateTab, complementDate = analyseDate( affichageDate )
if type( affichageDateTab ) ~= 'table' then
return affichageDateTab
else
end
resultatDate = resultatDate or fun.modeleDate( affichageDateTab )
local age, prefixAge, suffixAge, calculAge = '', ' <span class="noprint">(', ')</span>', nil
if naissance and
end
end
return prefix( resultatDate ) .. ( complementDate or '' ) .. age
end
-- la fonction dateISO renvoie un date au format aaaa-mm-jj (sans liens)
-- l'année peut être sous la forme 2013 ou [[2013 en litérature|2013]]
-- le mois peut être en lettre lettres ou en chiffres
-- le jour peut être sous la forme '05', '{{1er}}' ou 'vendredi 13'
function fun.dateISO( frame )
if type( annee ) == 'string' then
annee = ( tonumber( annee ) -- match '2013'
or string.match ( annee, '%D(%d%d%d%d)%D' ) -- match '[[2013 en musique|2013]]'
or string.match ( annee, '%D(%d%d%d%d)$' ) -- match '17 septembre 2013'
or string.match ( annee, '^(%d%d%d%d)%D' ) -- match '2013-09-17'
end
annee = tonumber( annee )
-- le format de date iso est défini suivant le calendrier grégorien.
-- Avant l'année 1583 la date est calendrier est probablement du calendrier julien,
-- donc autant s'abstenir.
if annee and annee > 1582 then
local mois = Outils.notEmpty( args.mois, args.month )
-- num mois trouve le numéro du mois, qu'il soit numérique ou texte, complet ou abrégé.
if numMois then
mois = '-' .. string.sub( '0' .. numMois, -2 )
local jour = Outils.notEmpty( args.jour, args.day, args['quantième'] )
if type( jour ) == 'string' then
-- Rangs des premiers des mois
local ranks = {0,31,59,90,120,151,181,212,243,273,304,334}
local rank = (ranks[mt] or 0) + dy - 1
if(fun.isLeapYear(yr) and (mt >= 3)) then
local yr1 = tonumber(arguments[1]) or 0
local yr2 = tonumber(arguments[2]) or 0
return fun.daysSinceOrigin(yr2) - fun.daysSinceOrigin(yr1)
end
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évolutionRévolution"}
local result = ""
if(arguments[2] < 13) then
---
-- Voir Modèle:Âge
-- retourne l'age âge en fonction de la ou les dates fournies. La valeur retounée retournée est de type 'number'-- Parammètres Paramètres :
-- 1, 2, 3 : année, mois jour de naissance (supposé dans le calendrier grégorien)
-- 4, 5, 6 : année, mois, joue jour du calcul (facultatif, par défaut la date UTC courante).
function fun.age( an, mn, jn, ac, mc, jc )
if ac == nil then
return
end
local age = ac - an
if mc == mn then
function fun.modeleAge( frame )
local args = frame.:getParent().args
local age = fun.age (
args[1] or args['année'],
local sinceYear = sinceCentury - math.floor( nYear * 1461 / 4 )
local nMonth = math.floor( ( sinceYear * 5 + 2 ) / 153 )
local day = sinceYear - math.floor( ( nMonth * 153 + 2 ) / 5 ) + 1 local month = nMonth - math.floor( nMonth / 10 ) * 12 + 3
local year = math.floor( sinceYear / 306 ) + nYear + 100 * nCentury - 4800
return year, month, day
end
---
-- calcul d'une date dans le calendrier julien à partir du jour julien
-- calcul basé sur l'algorythme algorithme de la page fr.wikipedia.org/wiki/Jour_julien (1/10/2013)
function fun.julianDayToJulian( julianDay )
local year = math.modf( ( julianDay * 4 - 6884469 ) / 1461 )
c'est l'heure d'été ou l'heure d'hiver.
Cette fonction n'a 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 correspondantcorrespondants
--]]
function fun.CEST(frame)
-- on récupère l'information dans la zone courante
local t = mw.getContentLanguage():formatDate("I", nil, true)
if (t == "1") then -- heure d'été
if (opt == "sans lien") then