Documentation[voir] [modifier] [historique] [purger]

Module pour calculer la date de Pâques et les dates relatives selon le Comput.

Calcul modifier

fonction pour calculer la date de Pâques et les dates relatives selon le Comput.

arguments modifier

Champ Fonction Exemple
1 Année 2024 or 1882
méthode méthode de calcul de la date de Pâques
Julien
calcul selon le calendrier Julien
Oriental or Orthodoxe
Calcul selon le calendrier Julien converti au calendrier Grégorien
Occidental or Grégorien or Romain
calcul selon le calendrier Grégorien. C'est le mode de calcul par défaut
Oriental pour calculer la date de Pâques dans le rite orthodoxe
jour Nom du jour relatif à Pâques ou nombre de jours (positif ou négatif) par rapport à Pâques. Les jours suivants sont reconnus par le module :
Septuagésime
63 jours avant Pâques – this is the earliest date returned by the function
Sexagésime
56 jours avant Pâques
Jeudi gras
52 jours avant Pâques
Quinquagésime
49 jours avant Pâques
Lundi pur
48 jours avant Pâques
Mardi gras
47 jours avant Pâques
Mercredi des Cendres
46 jours avant Pâques
Invocabit
42 jours avant Pâques
Reminiscere
35 jours avant Pâques
Oculi
28 jours avant Pâques
Laetare
21 jours avant Pâques
Semaine sainte
7 jours avant Pâques
Dimanche des Rameaux
7 jours avant Pâques
Lundi saint
6 jours avant Pâques
Mardi saint
5 jours avant Pâques
Mercredi saint
4 jours avant Pâques
Jeudi saint
3 jours avant Pâques
Vendredi saint
2 jours avant Pâques
Samedi saint
1 jour avant Pâques
Pâques
0
Lundi de Pâques
1 jour après Pâques
Divine Miséricorde
7 jours après Pâques
Misericordias Domini
14 jours après Pâques
Jubilate
21 jours après Pâques
Cantate
28 jours après Pâques
Vocem jucunditatis
35 jours après Pâques
Jeudi de l'Ascension
39 jours après Pâques
Pentecôte
49 jours après Pâques
Lundi de Pentecôte
50 jours après Pâques
Trinité
56 jours après Pâques
Fête-Dieu
60 jours après Pâques
Sacré-Cœur
jours après Pâques
Cœur immaculé de Marie
jours après Pâques
49 ou Pentecôte
format format de la date en sortie j xd

examples modifier

{{#invoke:Pâques|Calcul|{{CURRENTYEAR}}}}
2024-03-31
{{#invoke:Pâques|Calcul|{{CURRENTYEAR}}|méthode=Oriental}}
2024-05-05
{{#invoke:Pâques|Calcul|{{CURRENTYEAR}}|format=[[j xg]]}}
31 mars
{{#invoke:Pâques|Calcul|{{CURRENTYEAR}}|méthode=Oriental|format=[[j xg]]}}
5 mai
{{#invoke:Pâques|Calcul|{{CURRENTYEAR}}|jour=Pentecôte}}
2024-05-19
{{#invoke:Pâques|Calcul|{{CURRENTYEAR}}|méthode=Oriental|jour=Mercredi des Cendres}}
2024-03-20
{{#invoke:Pâques|Calcul|{{CURRENTYEAR}}|format=[[j xg]] (l)|jour=Mercredi des Cendres}}
14 février (mercredi)
{{#invoke:Pâques|Calcul|{{CURRENTYEAR}}|méthode=Oriental|format=[[j xg]] (l)|jour=Mercredi des Cendres}}
20 mars (mercredi)
local m = {}

local EasterData = {
    defaultMethod = 3,        -- default method of Easter date calculation when Easter type is not given
    defaultFormat = "Y-m-d",  -- default date output format
    noFormat      = "none",   -- prevent from final date formatting
    defaultOffset = 0,        -- the Easter date
    minimumOffset = -63,      -- Septuagesima
    maximumOffset = 69,       -- Feast of the Immaculate Heart of Mary
 
    -- API
    apiEaster            = "Calcul", -- public function name
    argEasterYear        = 1,           -- index or name of the argument with year
    argEasterMethod      = "méthode",    -- index or name of the argument with calculation method
    argEasterOffset      = "jour",       -- index or name of the argument with offset in days relative to the calculated Easter Sunday
    argEasterFormat      = "format",    -- index or name of the argument with date output format (#time style)
 
    -- errors
    errorMissingYear     = "L'argument obligatoire 'année' est manquant",
    errorInvalidYear     = "L'argument 'année' est incorrect : '%s'",
    errorInvalidOffset   = "L'argument 'jour' est incorrect : '%s'",
    errorInvalidMethod   = "L'argument 'méthode' est incorrect : '%s'",
    errorYearOutOfRange  = "Les dates de Pâques sont calculables entre les années 326 et 4099; année : %d",
    errorIncorrectMethod = "La Pâques orthodoxe et orientale n'existe que depuis 1583; année: %d",
    errorUnknownMethod   = "Méthode inconnue: %d",
 
    methods = {
        ["Julien"]      = 1,
        ["Oriental"]     = 2,
        ["Orthodoxe"]    = 2, -- alias for Eastern
        ["Copte"]      = 2, -- alias for Eastern
        ["Ethiopien"]   = 2, -- alias for Eastern
        ["Occidental"]     = 3,
        ["Grégorien"]   = 3, -- alias for Western
        ["Romain"]       = 3, -- alias for Western
    },
    -- the Meletian/Revised Julian Calendar from 1923 used by some Orthodox churches
    -- and any proposed reformed algorithms are not supported (yet):
    -- * astronomically observed Nicean rule at the meridian of Jerusalem (Aleppo 1997 proposal), differs from Gregorian in 
    -- * fifteenth Sunday of the year: Sunday in 099–105 day of the year
    -- * Sunday after second Saturday in April (UK): Sunday in 9–15 April
    -- * second Sunday in April: Sunday in 8–14 April
    -- * Sunday after 6 April (Pepuzite sect): Sunday in 7–13 April
    -- * World Calendar: day 099, any day of the week in Gregorian/Julian calendar
    -- * Positivist Calendar: day 098, any day of the week in Gregorian/Julian calendar

    -- * Sunday of ISO week 14: Sunday in 099–105 day of the year

    -- * Sunday of ISO week 15: Sunday in 106–112 day of the year
    -- * Nisan 14: any day of the week

    -- * Nisan 15: any day of the week

 
    relativeDates = {
        ["Septuagésime"]            = -63,
        ["Sexagésime"]               = -56,
        ["Jeudi gras"]               = -52,
        ["Quinquagésime"]            = -49,
        ["Lundi pur"]                = -48,
        ["Mardi gras"]               = -47,
        ["Mercredi des Cendres"]     = -46,
        ["Invocabit"]                = -42,
        ["Reminiscere"]              = -35,
        ["Oculi"]                    = -28,
        ["Laetare"]                  = -21, 
        ["Semaine sainte"]           =  -7,
        ["Dimanche des Rameaux"]     =  -7,
        ["Lundi saint"]              =  -6, 
        ["Mardi saint"]              =  -5, 
        ["Mercredi saint"]           =  -4, 
        ["Jeudi saint"]              =  -3,
        ["Vendredi saint"]           =  -2, -- Crucifixion
        ["Samedi saint"]             =  -1, 
        ["Pâques"]                   =   0,
        ["Lundi de Pâques"]          =   1,
        ["Divine Miséricorde"]       =   7,
        ["Misericordias Domini"]     =  14,
        ["Jubilate"]                 =  21,
        ["Cantate"]                  =  28,
        ["Vocem jucunditatis"]       =  35,
        ["Ascension"]                =  39,
        ["Pentecôte"]                =  49, 
        ["Lundi de Pentecôte"]       =  50,
        ["Trinité"]                  =  56, 
        ["Fête-Dieu"]                =  60, 
        ["Sacré-Cœur"]               =  68,
        ["Cœur immaculé de Marie"]   =  69,
    },
}
 
local function formatEasterError(message, ...)
    if select('#', ... ) > 0 then
        message = string.format(message, ...)
    end
    return "<span class=\"error\">" .. message .. "</span>"
end
 
local function loadEasterYear(year)
    if not year then
        return false, formatEasterError(EasterData.errorMissingYear)
    end
    local result = tonumber(year)
    if not result or math.floor(result) ~= result then
        return false, formatEasterError(EasterData.errorInvalidYear, year)
    end
 
    return true, result
end
 
local function loadEasterMethod(method, year)
    local result = EasterData.defaultMethod
    if method then
        result = EasterData.methods[method]
        if not result then
            return false, formatEasterError(EasterData.errorInvalidMethod, method)
        end
    end
 
    if year < 1583 then
        result = 1
    end
 
    return true, result
end
 
local function loadEasterOffset(day)
    if not day then
        return true, ""
    end
 
    local data = EasterData.relativeDates
    local offset = tonumber(day)
    if not offset then
        offset = data[day]
    end
    if not offset or offset ~= math.floor(offset) or offset < EasterData.minimumOffset or offset > EasterData.maximumOffset then
        return false, formatEasterError(EasterData.errorInvalidOffset, day)
    end
 
    if offset < -1 then
        return true, string.format(" %d days", offset)
    elseif offset == -1 then
        return true, " -1 day"
    elseif offset == 0 then
        return true, ""
    elseif offset == 1 then
        return true, " +1 day"
    else -- if offset > 1 then
        return true, string.format(" +%d days", offset)
    end
end
 
local function loadEasterFormat(fmt)
    if fmt == EasterData.noFormat then
        return true, nil
    elseif not fmt then
        return true, EasterData.defaultFormat
    else
        return true, fmt
    end
end
 
--[[
 PURPOSE:     This function returns Easter Sunday day and month
              for a specified year and method.
 
 INPUTS:      Year   - Any year between 326 and 4099.
              Method - 1 = the original calculation based on the
                           Julian calendar
                       2 = the original calculation, with the
                           Julian date converted to the
                           equivalent Gregorian calendar
                       3 = the revised calculation based on the
                           Gregorian calendar
 
 OUTPUTS:     None.
 
 RETURNS:     0, error message - Error; invalid arguments
              month, day       - month and day of the Sunday
 
 NOTES:
              The code is translated from DN OSP 6.4.0 sources.
              The roots of the code might be found in
              http://www.gmarts.org/index.php?go=415
 
 ORIGINAL NOTES:
 
              This algorithm is an arithmetic interpretation
              of the 3 step Easter Dating Method developed
              by Ron Mallen 1985, as a vast improvement on
              the method described in the Common Prayer Book
 
              Published Australian Almanac 1988
              Refer to this publication, or the Canberra Library
              for a clear understanding of the method used
 
              Because this algorithm is a direct translation of
              the official tables, it can be easily proved to be
              100% correct
 
              It's free! Please do not modify code or comments!
]]
local function calculateEasterDate(year, method)
    if year < 326 or year > 4099 then
        -- Easter dates are valid for years between 326 and 4099
        -- Method 2 would have to support dates in June thereafter
        return 0, formatEasterError(EasterData.errorYearOutOfRange, year)
    end
    if year < 1583 and method ~= 1 then
        -- Western or Orthodox Easter is valid since 1583
        return 0, formatEasterError(EasterData.errorIncorrectMethod, year)
    end
 
    -- intermediate result
    local firstDig = math.floor(year / 100)
    local remain19 = year % 19
    local temp = 0
    -- table A to E results
    local tA = 0
    local tB = 0
    local tC = 0
    local tD = 0
    local tE = 0
     -- Easter Sunday day
    local d = 0
 
    if method == 1 or method == 2 then
        -- calculate PFM date
        tA   = ((225 - 11 * remain19) % 30) + 21
        -- find the next Sunday
        tB   = (tA - 19) % 7
        tC   = (40 - firstDig) % 7
        temp = year % 100
        tD   = (temp + math.floor(temp / 4)) % 7
        tE   = ((20 - tB - tC - tD) % 7) + 1
        d    = tA + tE
        if method == 2 then
            -- convert Julian to Gregorian date
            -- 10 days were skipped in the Gregorian calendar from 5-14 Oct 1582
            temp = 10
            -- only 1 in every 4 century years are leap years in the Gregorian
            -- calendar (every century is a leap year in the Julian calendar)
            if year > 1600 then
                temp = temp + firstDig - 16 - math.floor((firstDig - 16) / 4)
            end
            d = d + temp
        end
    elseif method == 3 then
        -- calculate PFM date
        temp = math.floor((firstDig - 15) / 2)  + 202 - 11 * remain19
        if firstDig > 26 then
            temp = temp - 1
        end
        if firstDig > 38 then
            temp = temp - 1
        end
        if firstDig == 21 or firstDig == 24 or firstDig == 25 or firstDig == 33 or firstDig == 36 or firstDig == 37 then
            temp = temp - 1
        end
        temp = temp % 30
        tA   = temp + 21
        if temp == 29 then
            tA = tA - 1
        end
        if temp == 28 and remain19 > 10 then
            tA = tA - 1
        end
        -- find the next Sunday
        tB   = (tA - 19) % 7
        tC   = (40 - firstDig) % 4
        if tC == 3 then
            tC = tC + 1
        end
        if tC > 1 then
            tC = tC + 1
        end
        temp = year % 100
        tD   = (temp + math.floor(temp / 4)) % 7
        tE   = ((20 - tB - tC - tD) % 7) + 1
        d    = tA + tE
    else
        -- Unknown method
        return 0, formatEasterError(EasterData.errorUnknownMethod, method)
    end
    if d > 61 then
        -- when the original calculation is converted to the Gregorian
        -- calendar, Easter Sunday can occur in May
        return 5, d - 61
    elseif d > 31 then
        return 4, d - 31
    else
        return 3, d
    end
end
 
local function Easter(args)
    local ok
    local year
    ok, year = loadEasterYear(args[EasterData.argEasterYear])
    if not ok then
        return year
    end
 
    local method
    ok, method = loadEasterMethod(args[EasterData.argEasterMethod], year)
    if not ok then
        return method
    end
 
    local offset
    ok, offset = loadEasterOffset(args[EasterData.argEasterOffset])
    if not ok then
        return offset
    end
 
    local format
    ok, format = loadEasterFormat(args[EasterData.argEasterFormat])
    if not ok then
        return format
    end
 
    local month, day = calculateEasterDate(year, method)
    if month == 0 then
        return day
    end
 
    local result = string.format("%04d-%02d-%02d%s", year, month, day, offset)
    if format then
        result = mw.language.getContentLanguage():formatDate(format, result)
    end
 
    return result
end
 
m[EasterData.apiEaster] = function (frame)
    return Easter(frame.args)
end
 
return m