Jump to content

Module:BENGALIDATE

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by R1F4T (talk | contribs) at 11:17, 21 April 2025 (Created page with 'local p = {} local data = mw.loadData('Module:BENGALIDATE/data') local lang = mw.language.getContentLanguage() local getArgs = require('Module:Arguments').getArgs local now = os.time() local cTime = now + (6 * 60 * 60) local currentDate = os.date("%d %B %Y", cTime) local function uc(value) return lang:ucfirst(value) end local function dmy(i) local day, month, year = i:match("(%d%d?) (%a+) (%d%d%d%d)") return tonumber(day), month, year end -- BN month...'). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)

local p = {}
local data = mw.loadData('Module:BENGALIDATE/data')
local lang = mw.language.getContentLanguage()
local getArgs = require('Module:Arguments').getArgs

local now = os.time() 
local cTime = now + (6 * 60 * 60)
local currentDate = os.date("%d %B %Y", cTime)

local function uc(value) return lang:ucfirst(value) end

local function dmy(i)
	local day, month, year = i:match("(%d%d?) (%a+) (%d%d%d%d)")
	return tonumber(day), month, year
end

-- BN month (in English transliteration)
local function getBNmonth(day, month)
	local bnMonth = {
		January = {15, "Magh", "Poush"},
		February = {14, "Falgun", "Magh"},
		March = {15, "Chaitra", "Falgun"},
		April = {14, "Boishakh", "Chaitra"},
		May = {15, "Joishtho", "Boishakh"},
		June = {15, "Asharh", "Joishtho"},
		July = {15, "Shrabon", "Asharh"},
		August = {15, "Bhadro", "Shrabon"},
		September = {15, "Ashwin", "Bhadro"},
		October = {15, "Kartik", "Ashwin"},
		November = {15, "Agrahayan", "Kartik"},
		December = {15, "Poush", "Agrahayan"}
	}
	local dateLimit, bnMafter, bnMbefore = unpack(bnMonth[month])
	if day >= dateLimit then
		return bnMafter
	else
		return bnMbefore
	end
end

-- BN Year
local function getBNyear(day, month, year)
	local bn_year
	if month == 'April' and day >= 14 then
		bn_year = tonumber(year) - 593
	elseif month == 'April' and day < 14 then
		bn_year = tonumber(year) - 594
	elseif month == 'May' or month == 'June' or month == 'July' or month == 'August'
		or month == 'September' or month == 'October' or month == 'November' or month == 'December' then
		bn_year = tonumber(year) - 593
	else
		bn_year = tonumber(year) - 594
	end
	return bn_year
end

-- BN day
local function getBNday(day, month, year)
	local bn_day = data[month] and data[month][day] or day
	local leapYear = tonumber(year) % 4 == 0 and (tonumber(year) % 100 ~= 0 or tonumber(year) % 400 == 0)

	if leapYear and uc(month) == "March" and day >= 1 and day <= 14 then
		bn_day = bn_day + 1
	end

	return bn_day
end

-- formatter
local function format_date(day, month, year, format)
	local components = { d = day, m = month, y = year }
	local result = {}

	for i = 1, #format do
		local char = format:sub(i, i)
		table.insert(result, components[char] or char)
	end

	return table.concat(result)
end

-- Main Function
function p.main(frame)
	local args = getArgs(frame)
	local format = args[2] or args['format'] or 'd m y'
	if format == '' then
		format = 'd m y'
	end

	local input = args[1] or currentDate
	local gday, gmonth, gyear = dmy(input)

	if not gday then
		gday, gmonth, gyear = dmy(currentDate)
		format = args[1]
		if format == '' then format = 'd m y' end
	end

	local byear = getBNyear(gday, gmonth, gyear)
	local bmonth = getBNmonth(gday, gmonth)
	local bday = getBNday(gday, gmonth, gyear)

	return format_date(bday, bmonth, byear, format)
end

return p