« Module:Date » : différence entre les versions
en cours |
mise en place modèle:Date (pas terminé) |
||
Ligne 1 : | Ligne 1 : | ||
local fun = {} | local fun = {} | ||
-- génère une erreur | |||
function fun.erreurDate(texte) | |||
return '<span class="error">' .. (texte or "''aucune erreur indiquée''") .. "</span>" | |||
end | |||
-- nettoie un paramètre non nommé (vire les espaces au début et à la fin) | |||
function fun.nettoie(texte) | |||
if (texte == nil or texte == "") then | |||
return "" | |||
end | |||
if (type(texte) ~= "string") then | |||
return "" | |||
end | |||
return mw.ustring.gsub(mw.ustring.gsub(texte, "^%s*", ""), "%s*$", "") | |||
end | |||
-- liste des mois, écriture exacte et simplifiée, en minuscule | -- liste des mois, écriture exacte et simplifiée, en minuscule | ||
Ligne 50 : | Ligne 68 : | ||
-- émule le modèle {{m|Date}}. Pas complet. | -- émule le modèle {{m|Date}}. Pas complet. | ||
function fun.modeleDate(frame) | function fun.modeleDate(frame) | ||
local args = frame:getParent().args | -- local args = frame:getParent().args | ||
local args = frame.args | |||
--[[ | --[[ | ||
paramètres : | paramètres : | ||
Ligne 58 : | Ligne 77 : | ||
4 : optionnel, spécialité de l'année | 4 : optionnel, spécialité de l'année | ||
]]-- | ]]-- | ||
local bjour = args[1] | local bjour = fun.nettoie(args[1]) | ||
-- on traite le jour si présent | -- on traite le jour si présent | ||
if (bjour ~= nil) then | if (bjour ~= nil and bjour ~= "") then | ||
local tmp = tonumber(bjour) | local tmp = tonumber(bjour) | ||
if (tmp == nil) then | if (tmp == nil) then | ||
Ligne 66 : | Ligne 85 : | ||
jour = 1 | jour = 1 | ||
else | else | ||
return fun.erreurDate("Jour invalide (" .. bjour .. ")") | |||
end | end | ||
else | else | ||
jour = tmp | jour = tmp | ||
end | |||
-- on valide que le jour est correct | |||
if ((jour < 1) or (jour > 31)) then | |||
-- note : il faudrait valider le jour en fonction du mois (30/31 ou 28/29) | |||
return fun.erreurDate("Jour invalide (" .. bjour .. ")") | |||
end | end | ||
else | else | ||
Ligne 76 : | Ligne 99 : | ||
end | end | ||
-- on traite le mois | |||
local bmois = fun.nettoie(args[2]) | |||
if (bmois == "") then | |||
return fun.erreurDate("Le mois est obligatoire") | |||
end | |||
local mois, num = fun.valideMois(bmois) | |||
if (mois == nil) then | |||
return fun.erreurDate("Mois invalide (" .. bmois .. ")") | |||
end | |||
-- on regarde si la première lettre est en majuscule | |||
if (mw.ustring.match(bmois, "^%u") ~= nil) then | |||
-- oui, on passe la première lettre en majuscule | |||
local debut = mw.ustring.match(mois, "^.") | |||
local fin = mw.ustring.match(mois, "^.(.*)$") | |||
mois = mw.ustring.upper(debut) .. fin | |||
end | |||
-- on traite l'année | |||
local bannee = fun.nettoie(args[3]) | |||
if (bannee == "") then | |||
return fun.erreurDate("L'année est obligatoire") | |||
end | |||
local tmp = tonumber(bannee) | |||
if (tmp == nil) then | |||
return fun.erreurDate("Année avalide (" .. bannee .. ")") | |||
end | |||
annee = tmp | |||
-- le champs optionnel | |||
local opt = fun.nettoie(args[4]) | |||
if (opt == "") then | |||
opt = nil | |||
end | |||
-- on génère le résultat | |||
local res = "" | |||
-- le jour si présent | |||
if (jour ~= nil) then | |||
if (jour == 1) then | |||
res = res .. "[[1er " .. mois .. "|1<sup>er</sup>" .. "]] " | |||
else | |||
res = res .. "[[" .. jour .. " " .. mois .. "|" .. jour .. "]] " | |||
end | |||
end | |||
-- le mois | |||
res = res .. "[[" .. mois .. " " .. annee .. "|" .. mois .. "]] " | |||
-- l'année | |||
if (opt == nil) then | |||
res = res .. "[[" .. annee .. "]]" | |||
else | |||
res = res .. "[[" .. annee .. " " .. opt .. "|" .. annee .. "]]" | |||
end | |||
return | return res | ||
end | end | ||
Version du 2 mars 2013 à 20:19
local fun = {}
-- génère une erreur
function fun.erreurDate(texte)
return '' .. (texte or "aucune erreur indiquée") .. ""
end
-- nettoie un paramètre non nommé (vire les espaces au début et à la fin) function fun.nettoie(texte)
if (texte == nil or texte == "") then return "" end if (type(texte) ~= "string") then return "" end return mw.ustring.gsub(mw.ustring.gsub(texte, "^%s*", ""), "%s*$", "")
end
-- liste des mois, écriture exacte et simplifiée, en minuscule
local liste_mois = {
{ "janvier", "jan.", "janv.", "jan", "janv" }, { "février", "fevrier", "fev.", "fev", "fév.", "fév" }, { "mars", "mar.", "mar" }, { "avril", "avr.", "avr" }, { "mai" }, { "juin" }, { "juillet" }, { "août", "aout" }, { "septembre", "sep.", "sep" }, { "octobre", "oct.", "oct" }, { "novembre", "nov.", "nov" }, { "décembre", "decembre", "déc.", "dec.", "dec", "déc" }
}
-- nom du mois à partir du numéro function fun.nomDuMois(num)
if (type(num) ~= "number") then return nil end if ((num < 1) or (num > 12)) then return nil end return (liste_mois[num])
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.valideMois(mois)
local m = mw.ustring.lower(mois)
for i = 1, 12 do local j = 1 while (liste_mois[i][j] ~= nil) do if (liste_mois[i][j] == m) then return liste_mois[i][1], i end j = j + 1 end end -- pas trouvé return nil
end
-- émule le modèle {{Date}}. Pas complet.
function fun.modeleDate(frame)
-- local args = frame:getParent().args local args = frame.args --[[ 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 ]]-- local bjour = fun.nettoie(args[1]) -- on traite le jour si présent if (bjour ~= nil and bjour ~= "") then local tmp = tonumber(bjour) if (tmp == nil) then if (bjour == "1er") then jour = 1 else return fun.erreurDate("Jour invalide (" .. bjour .. ")") end else jour = tmp end -- on valide que le jour est correct if ((jour < 1) or (jour > 31)) then -- note : il faudrait valider le jour en fonction du mois (30/31 ou 28/29) return fun.erreurDate("Jour invalide (" .. bjour .. ")") end else jour = nil end -- on traite le mois local bmois = fun.nettoie(args[2]) if (bmois == "") then return fun.erreurDate("Le mois est obligatoire") end local mois, num = fun.valideMois(bmois) if (mois == nil) then return fun.erreurDate("Mois invalide (" .. bmois .. ")") end -- on regarde si la première lettre est en majuscule if (mw.ustring.match(bmois, "^%u") ~= nil) then -- oui, on passe la première lettre en majuscule local debut = mw.ustring.match(mois, "^.") local fin = mw.ustring.match(mois, "^.(.*)$") mois = mw.ustring.upper(debut) .. fin end -- on traite l'année local bannee = fun.nettoie(args[3]) if (bannee == "") then return fun.erreurDate("L'année est obligatoire") end local tmp = tonumber(bannee) if (tmp == nil) then return fun.erreurDate("Année avalide (" .. bannee .. ")") end annee = tmp
-- le champs optionnel local opt = fun.nettoie(args[4]) if (opt == "") then opt = nil end
-- on génère le résultat local res = "" -- le jour si présent if (jour ~= nil) then if (jour == 1) then res = res .. "1er" .. " " else res = res .. "" .. jour .. " " end end -- le mois res = res .. "" .. mois .. " " -- l'année if (opt == nil) then res = res .. "" .. annee .. "" else res = res .. "" .. annee .. "" end return res
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}
local rank = (ranks[mt] or 0) + dy - 1 if(fun.isLeapYear(yr) and (mt >= 3)) then rank = rank+1 end return rank end
-- Nombre de jours entre deux années (du 1er janvier au 1er janvier) -- Suit le calendrier grégorien function fun.do_daysBetween(arguments) local yr1 = tonumber(arguments[1]) or 0 local yr2 = tonumber(arguments[2]) or 0
return fun.daysSinceOrigin(yr2) - fun.daysSinceOrigin(yr1) end
-- Nombre de jours depuis l'année 1 (du 1er janvier au 1er janvier) function fun.daysSinceOrigin(year) local yr = year-1 return 365*yr + math.floor(yr/4) - math.floor(yr/100) + math.floor(yr/400) end
-- Test d'année bissextile function fun.isLeapYear(year) local yr = tonumber(year) or 1 return (yr%4 == 0) and ((yr%100 ~= 0) or (yr%400 == 0)) end
-- Conversion d'un nombre en chiffres romains function fun.toRoman(number) local n = math.floor(number) local letters = {"I","V","X","L","C","D","M","",""} local pattern = {"","0","00","000","01","1","10","100","1000","02"} local result = "" if(n<=0 or n>=4000) then result = "---" else for i=1,7,2 do p = pattern[n%10 + 1] for j=0,2 do p = string.gsub(p,tostring(j),letters[i+j]) end result = p .. result n = math.floor(n/10) 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
return fun