Edge Rewrite
// HTMLRewriter · presentation

This page was redesigned at the edge.

Cloudflare fetched the original article and streamed it through HTMLRewriter to apply an entirely new visual system without rebuilding the source page.

Jump to content

Module:BENGALIDATE

From Wikipedia, the free encyclopedia

local p = {}
local getArgs = require('Module:Arguments').getArgs
local timestamp = require('Module:Bengali Calendar Epoch Offset')._main
local function isLeapYear(year)
	return ((year - 594) % 4 == 0)
end
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)
        if components[char] then
            table.insert(result, components[char])
        else
            table.insert(result, char)
        end
    end

    return table.concat(result)
end
local BN_MONTH = {
	[1] = "Boisakh",
	[2] = "Joishtho",
	[3] = "Asharh",
	[4] = "Shrabon",
	[5] = "Bhadro",
	[6] = "Ashshin",
	[7] = "Kartik (month)|Kartik",
	[8] = "Ogrohayon",
	[9] = "Poush",
	[10] = "Magh (Bengali calendar)|Magh",
	[11] = "Falgun",
	[12] = "Chaitro"
}
function p.main(frame)
	local args = getArgs(frame)
	local ts = args[1] or tostring(timestamp())
	local format = "m d, y"
    local isdate = ts:match("^%d+%-%d+%-%d+$") or ts:match("^%d+%s+%a+%s+%d+$") 
    if isdate then
       ts =tonumber(timestamp(ts))
    else 
    	ts = tonumber(timestamp(args[2]))
    	format = args[1] or "m d, y"
    end
	
	local second = 86400
	local days = math.floor(ts / second)

	local year = 1432  -- Adjust according to your epoch

	if days >= 0 then
		while true do
			local leap = isLeapYear(year) and 366 or 365
			if days < leap then break end
			days = days - leap
			year = year + 1
		end
	else
		while true do
			local leap = isLeapYear(year - 1) and 366 or 365
			if -days <= leap then
				year = year - 1
				days = days + leap
				break
			end
			days = days + leap
			year = year - 1
		end
	end

	local isLeap = isLeapYear(year)
	local monthLengths = {31,31,31,31,31,31,30,30,30,30,isLeap and 30 or 29, 30}
	local month = 1

	while days >= monthLengths[month] do
		days = days - monthLengths[month]
		month = month + 1
	end
	month = BN_MONTH[month]

	local day = days + 1

	return format_date(day, month, year, format)
end

return p