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

Contenu supprimé Contenu ajouté
Od1n (discussion | contributions)
il existe une variable modelePremier, mieux vaut l'utiliser partout où elle est adaptée
fusion de modeleDateAnalyseJMA dans modeleDate ; modeleDate : validation des paramètres booléen avec Yesno ; retrait de TableBuilder ; mise en page et mise à jour commentaires
Ligne 1 :
local fun = {}
 
local TableBuilderOutils = require( 'Module:TableBuilderOutils' )
local OutilsYesno = require( 'Module:OutilsYesno' )
-- chargement de la base de donnée répertoriant certaines pages existant ou n'existant pas pour éviter les "ifexist".
local dataLiens
Ligne 304 :
 
---
-- validationJourMoisAnnee vérifie les paramètres correspondent à une date valide.
-- 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 2dans àdes paramètres jour, mois et 4annee.
-- 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.
Ligne 413 ⟶ 412 :
end
 
---
-- analyse des paramètres 1, 2, 3 et 4
-- pour déterminer les paramètres jour, moisn année, qualificatif, masquerAnnee, et masquerMois
function fun.modeleDateAnalyseJMA( args )
local function masquerParam( p )
-- sépare le signe moins final éventuel signifiant que le paramètre ne soit pas être affiché.
local s
if trim( p ) then
p, s = p:match( '^(.-)(%-?)%s*$' )
end
return p, ( s == '-' or nil )
end
local test, resultat
local arg1, arg2, arg3 = fun.nettoyageJour( args[1] ), trim( args[2] ), trim( args[3] )
if type( arg1 ) == 'string' and arg3 == nil and ( arg1:match( '[^ ./-][ ./-]+[^ ./-]' ) or arg2 == nil or dataLiens[arg2] or mw.ustring.match( arg2, '%a %a' ) ) then
-- la date est dans le premier paramètre
test, resultat = fun.separationJourMoisAnnee( arg1 )
if test then
resultat.qualificatif = arg2
end
else
local param, masquerM, masquerA
param = { args[1] or args.jour }
param[2], masquerM = masquerParam( args[2] or args.mois )
param[3], masquerA = masquerParam( args[3] or args.annee or args['annee'] )
param[4] = masquerParam( args[4] )
test, resultat = fun.validationJourMoisAnnee( param )
if test then
resultat.masquerAnnee = masquerA
resultat.masquerMois = masquerM
resultat.qualificatif = trim( args[4] )
end
end
return test, resultat
end
 
---
Ligne 467 ⟶ 429 :
function fun.modeleDate( frame )
local args = Outils.extractArgs( frame )
local test, params = fun.modeleDateAnalyseJMA( args )
local cat, resultat = ''
-- analyse des paramètres non nommé (ou paramètres de la date jour, mois annee)
local test, resultatparams
local arg1, arg2, arg3 = fun.nettoyageJour( args[1] ), trim( args[2] ), trim( args[3] )
if type( arg1 ) == 'string' and arg3 == nil and ( arg1:match( '[^ ./-][ ./-]+[^ ./-]' ) or arg2 == nil or dataLiens[arg2] or mw.ustring.match( arg2, '%a %a' ) ) then
-- la date est dans le premier paramètre
test, resultatparams = fun.separationJourMoisAnnee( arg1 )
if trim( p )test then
resultatparams.qualificatif = arg2
end
else
local function masquerParam( p )
-- sépare le signe moins final éventuel signifiant que le paramètre ne soitdoit pas être affiché.
if type( p ) ~= 'string' then
return p, nil
end
plocal value, smask = p:match( '^%s*(.-)(%-?)%s*$' )
return pvalue, ( smask == '-' or nil )
end
paramlocal cleanArgs = { args[1]arg1 or args.jour }
paramcleanArgs[2], masquerMcleanArgs.masquerMois = masquerParam( args[2] or args.mois )
paramcleanArgs[3], masquerAcleanArgs.masquerAnnee = masquerParam( args[3] or args.annee or args['annee'] )
mw.logObject( cleanArgs )
test, resultatparams = fun.validationJourMoisAnnee( paramcleanArgs )
if test then
resultatparams.qualificatif = trim( args[4] )
end
end
-- analyse des paramètres 1, 2, 3 et 4 nommés
if test then
params.qualificatif = 'params.qualificatif or args.qualificatif',
-- julien peut avoir trois valeurs: inactif, format standard (true), format court
local params.julien = trim( string.lowerYesno( args.julien or, 'court', )false )
local listeParam = {
qualificatif = 'qualificatif',
age = 'âge',
['âge'] = 'âge',
Ligne 477 ⟶ 471 :
mort = 'mort',
['décès'] = 'mort',
julien = 'julien',
avJC = 'avJC',
nolinks = 'nolinks',
Ligne 484 ⟶ 477 :
}
for n, v in pairs( listeParam ) do
params[v] = params[v] or trimYesno( args[n], true, false ) or nil
end
-- sortie pour les tests unitaire, ou pour débuger
if testargs.debug then
return params
end
resultat = fun._modeleDate( params )
 
Ligne 495 ⟶ 494 :
resultat = params .. cat
end
return resultat or ''
end
Ligne 515 :
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
Ligne 525 ⟶ 524 :
gannee, gmois, gjour = fun.julianToGregorian( annee + 1, numMois, jour )
end
elseif args.julien == 'oui' then
gannee, gmois, gjour = fun.julianToGregorian( annee, numMois, jour )
annee, mois, jour = gannee, listeMois[gmois].nom, gjour
Ligne 539 ⟶ 538 :
-- 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 texteMois = mois -- texte du mois qui sera affiché (éventuellement l'abréviation)
if args.compact then
Ligne 577 ⟶ 576 :
jjour = modelePremier
end
if args.compact then
jmois = listeMois[ jmois ].abrev
end
Ligne 596 ⟶ 595 :
jour = modelePremier
end
wikiListetable.insert( wikiListe, jour )
else
qualifJour = dataQualificatif.jour and dataQualificatif.qualificatif
Ligne 607 ⟶ 606 :
end
-- s'il n'y a pas de lien sur le mois, il sera affiché avec le jour.
wikiListetable.insert( wikiListe, wikiLien( lien, jour ) )
wikiListetable.insert( wikiListe, wikiLien( lien, jour .. ' '.. texteMois ) )
end
isotable.insert( iso, 1, string.sub( '0' .. gjour, -2 ) )
end
Ligne 620 ⟶ 619 :
if args.nolinks then
if not args.masquerMois then
wikiListetable.insert( wikiListe, texteMois )
end
else
Ligne 633 ⟶ 632 :
if lien or args.masquerMois then
-- s'il y a un lien on retire le lien affichant 'jour mois' pour ajouter '[[mois annee|mois']]
wikiListetable.remove( wikiListe )
if not args.masquerMois then
wikiListetable.insert( wikiListe, wikiLien( lien, texteMois ) )
end
elseif #wikiListe > 0 then
-- sinon on retire le lien affichant 'jour' pour ne garder que le lien 'jour mois'
wikiListetable.remove( wikiListe, #wikiListe - 1 )
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.
wikiListetable.insert( wikiListe, texteMois )
end
end
if gmois then
isotable.insert( iso, 1, string.sub( '0' .. gmois, -2 ) )
end
end
if( julien2 ) then
wikiListetable.insert( wikiListe, julien2 )
end
Ligne 670 ⟶ 669 :
end
if args.nolinks then -- seulement si on doit l'affichée
wikiListetable.insert( wikiListe, texteAnnee )
else
lien = existDate( dataQualificatif, annee ) or existDate( dataCat, annee ) or lien or annee
Ligne 677 ⟶ 676 :
texteAnnee = texteMois .. ' ' .. texteAnnee
end
wikiListetable.insert( wikiListe, wikiLien( lien, texteAnnee ) )
end
end
if gannee > 999 then
isotable.insert( iso, 1, gannee )
elseif gannee > -1 then
isotable.insert( iso, 1, string.sub( '000' .. gannee , -4 ) )
elseif gannee > -999 then
-- calendrier grégorien proleptique avec année 0.
isotable.insert( iso, 1, 'U-' .. string.sub( '000' .. ( 0 - gannee ), -4 ) )
else
isotable.insert( iso, 1, 'U' .. gannee )
end
end
if( julien3 ) then
wikiListetable.insert( wikiListe, julien3 )
end
 
Ligne 711 ⟶ 710 :
-- compilation du résultat
local wikiTexte = wikiListetable.concat( wikiListe, ' ' )
local isoTexte = isotable.concat( iso, '-' )
-- On ajoute un peu de sémantique.
Ligne 755 ⟶ 754 :
-- qualificatif = suffixe des page de date à lier (exemple : en musique)
-- nolinks : n'affiche pas de lien
-- préfixe : préfixe à afficher s'il y a un jour (par défaut '')
-- préfixe sans jour : préfixe à afficher s'il n'y a pas de jour (par défaut : '')
function fun.dateInfobox( frame )
Ligne 763 ⟶ 762 :
end
-- analyseDate sépare la date du contenu qui suit, supprime les liens, et retourne si possible un table avec jour mois année
local function analyseDate( d )
if trim( d ) then
-- supprime les liens
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
Ligne 771 ⟶ 770 :
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 lienslien
analyse = analyse:gsub( '%[%[([^%[%]|]*)|?([^%[%]]*)%]%]', function ( l, t ) return trim( t ) or l end )
analyse = analyse:gsub(
'%[%[([^%[%]|]*)|?([^%[%]]*)%]%]',
function ( l, t )
return trim( t ) or l
end
)
local t, r = fun.separationJourMoisAnnee( analyse )
if t then
Ligne 799 ⟶ 806 :
end
local naissance = args[1]:match( '^n' ) == 'n'
local mort = args[1]:match( '^m' ) or args[1]:match( 'décès' )
local affichageDate, qualificatif = args[2], args[4]
Ligne 844 ⟶ 851 :
local age, prefixAge, suffixAge, calculAge = '', ' <span class="noprint">(', ')</span>', nil
if naissance and
dateNaissance and
not dateMort and
type( dateNaissance ) == 'table'
then
calculAge = fun.age( dateNaissance.annee, dateNaissance.numMois, dateNaissance.jour )
if calculAge and calculAge > 120 then
calculAge = nil
end
elseif mort and
dateNaissance and
dateMort and
type( dateNaissance ) == 'table'
and type( dateMort ) == 'table'
then
calculAge = fun.age(
dateNaissance.annee,
dateNaissance.numMois,
dateNaissance.jour,
dateMort.annee,
dateMort.numMois,
dateMort.jour )
)
prefixAge = ' (à '
suffixAge = ')'
Ligne 1 166 ⟶ 1 189 :
local alias = frame.args.alias == 'oui'
local dataLink = mw.loadData( 'Module:Date/Data' )
local wikiList = TableBuilder.new(){}
local currentYear = tonumber( os.date( '%Y' ) )
local columns = '<div style="-moz-column-width:5em;-webkit-column-width:5em;column-width:5em;-moz-column-gap:1em;-webkit-column-gap:1em;column-gap:1em;text-align:left;">'
Ligne 1 202 ⟶ 1 225 :
if initialYear then
-- ajout de lien vers les pages annuelles de l'année en court + 5 jusqu'à initialYear
wikiListtable.insert( wikiList, string.format( newSection, field ) )
local fieldLink = ' ' .. field
if category == 'cat' then
Ligne 1 208 ⟶ 1 231 :
end
for year = ( currentYear + 5 ), initialYear, -1 do
wikiListtable.insert( wikiList, '\n* [[' .. year .. fieldLink ..'|' .. year .. ']]' )
end
wikiListtable.insert( wikiList, '\n</div>' )
if monthLinks then
-- insertstion de liens vers les mois de l'année en court + 1 jusqu'à monthInitialYear
wikiListtable.insert( wikiList, '\n\n=== Mois ===' )
local month, sep
for year = ( currentYear + 1 ), monthInitialYear, -1 do
wikiListtable.insert( wikiList, '\n* ' .. year .. ' : ' )
sep = ' • '
for j = 1, 12 do
Ligne 1 223 ⟶ 1 246 :
if j == 12 then sep = ''
end
wikiListtable.insert( wikiList, '[[' .. month .. year .. ' ' .. fieldLink .. '|' .. month .. ']]' .. sep )
end
end
-- insertion de quelques date pour tester les éphémérides
wikiListtable.insert( wikiList, '\n\n=== Jours ===' )
wikiListtable.insert( wikiList, '\n* [[1er janvier ' .. fieldLink .. ']]' )
wikiListtable.insert( wikiList, '\n* [[14 mars ' .. fieldLink .. ']]' )
wikiListtable.insert( wikiList, '\n* [[22 juin ' .. fieldLink .. ']]' )
wikiListtable.insert( wikiList, '\n* [[3 septembre ' .. fieldLink .. ']]' )
end
end