Module:Date : Différence entre versions

De Lagny-sur-Marne Wiki
Aller à : navigation, rechercher
m (Fonction toRepCal : semptembre et non juillet)
(en cours)
Ligne 1 : Ligne 1 :
 
local fun = {}
 
local fun = {}
 +
 +
-- 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 {{m|Date}}. Pas complet.
 +
function fun.modeleDate(frame)
 +
    local args = frame:getParent().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 = args[1]
 +
    -- on traite le jour si présent
 +
    if (bjour ~= nil) then
 +
        local tmp = tonumber(bjour)
 +
        if (tmp == nil) then
 +
            if (bjour == "1er") then
 +
                jour = 1
 +
            else
 +
                jour = nil
 +
                -- erreur à générer
 +
            end
 +
        else
 +
            jour = tmp
 +
        end
 +
    else
 +
        jour = nil
 +
    end
 +
   
 +
   
 +
   
 +
    return ""
 +
end
 +
 +
 +
  
 
-- Rang du jour dans l'année
 
-- Rang du jour dans l'année

Version du 2 mars 2013 à 19:02

La documentation pour ce module peut être créée à Module:Date/doc

local fun = {}

-- 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 {{m|Date}}. Pas complet.
function fun.modeleDate(frame)
    local args = frame:getParent().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 = args[1]
    -- on traite le jour si présent
    if (bjour ~= nil) then
        local tmp = tonumber(bjour)
        if (tmp == nil) then
            if (bjour == "1er") then
                jour = 1
            else
                jour = nil
                -- erreur à générer
            end
        else
            jour = tmp
        end
    else
        jour = nil
    end
    
    
    
    return ""
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]) .. "&nbsp;" .. 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