Module:Vikram Samvat
Appearance
--------------------------------------------------------------------------------
-- Module:Vikram Samvat
-- Version 0.2
-- Vikram Samvat calendar for MediaWiki
--------------------------------------------------------------------------------
local p = {}
--------------------------------------------------------------------------------
--Month names
--------------------------------------------------------------------------------
local months = {
[1] = {
en = "Baisakh",
ne = "बैशाख"
},
[2] = {
en = "Jestha",
ne = "जेष्ठ"
},
[3] = {
en = "Ashadh",
ne = "अषाढ"
},
[4] = {
en = "Shrawan",
ne = "श्रावण"
},
[5] = {
en = "Bhadra",
ne = "भाद्र"
},
[6] = {
en = "Ashwin",
ne = "आश्विन"
},
[7] = {
en = "Kartik",
ne = "कार्तिक"
},
[8] = {
en = "Mangsir",
ne = "मंसिर"
},
[9] = {
en = "Poush",
ne = "पौष"
},
[10] = {
en = "Magh",
ne = "माघ"
},
[11] = {
en = "Falgun",
ne = "फाल्गुण"
},
[12] = {
en = "Chaitra",
ne = "चैत्र"
}
}
local bsData = {
[2080] = {
31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30
},
[2081] = {
31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31
},
[2082] = {
31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30
},
[2083] = {
31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30
},
[2084] = {
31, 31, 32, 31, 31, 30, 30, 30, 29, 30, 30, 30
},
[2085] = {
31, 32, 31, 32, 30, 31, 30, 30, 29, 30, 30, 30
}
}
--------------------------------------------------------------------------------
-- Returns the number of days in a BS month
--------------------------------------------------------------------------------
local function getMonthLength(year, month)
if bsData[year] and bsData[year][month] then
return bsData[year][month]
end
return nil
end
--------------------------------------------------------------------------------
-- Reference date (Epoch)
--------------------------------------------------------------------------------
local epoch = {
adYear = 2023,
adMonth = 4,
adDay = 14,
bsYear = 2080,
bsMonth = 1,
bsDay = 1
}
--------------------------------------------------------------------------------
-- Returns true if Gregorian year is a leap year
--------------------------------------------------------------------------------
local function isLeapYear(year)
return (year % 4 == 0 and year % 100 ~= 0)
or (year % 400 == 0)
end
--------------------------------------------------------------------------------
-- Gregorian month lengths
--------------------------------------------------------------------------------
local gregorianMonthLengths = {
31, -- January
28, -- February
31, -- March
30, -- April
31, -- May
30, -- June
31, -- July
31, -- August
30, -- September
31, -- October
30, -- November
31 -- December
}
--------------------------------------------------------------------------------
-- Returns the number of days in a Gregorian month
--------------------------------------------------------------------------------
local function getGregorianMonthLength(year, month)
if month == 2 and isLeapYear(year) then
return 29
end
return gregorianMonthLengths[month]
end
--------------------------------------------------------------------------------
-- Returns the number of days since the epoch (14 April 2023)
--------------------------------------------------------------------------------
local function daysSinceEpoch(year, month, day)
local days = 0
-- Count complete years
for y = epoch.adYear, year - 1 do
if isLeapYear(y) then
days = days + 366
else
days = days + 365
end
end
-- Count complete months
for m = 1, month - 1 do
days = days + gregorianMonthLengths[m]
if m == 2 and isLeapYear(year) then
days = days + 1
end
end
-- Count days
days = days + day
-- Remove days before the epoch (14 April)
if year == epoch.adYear then
days = days - 104
end
return days
end
--------------------------------------------------------------------------------
-- Returns month name
--------------------------------------------------------------------------------
function p.month(frame)
local n = tonumber(frame.args[1]) or 1
local lang = frame.args.lang or "en"
if months[n] then
return months[n][lang] or months[n]["en"]
end
return "Unknown"
end
--------------------------------------------------------------------------------
-- Test function
--------------------------------------------------------------------------------
function p.test()
return "Module loaded successfully."
end
return p