Module:Month

From Bonkipedia

Documentation for this module may be created at Module:Month/doc

local p = {}

local months = {
	"January",
	"February",
	"March",
	"April",
	"May",
	"June",
	"July",
	"August",
	"September",
	"October",
	"November",
	"December",
}

local month_numbers = {}

for number, name in pairs(months) do
	month_numbers[name] = number
end

function valid_month(month)
	month_number = tonumber(month)

	if (month_number == nil) then
		month_number = month_numbers[month]
	end

	if (month_number == nil or month_number < 1 or month_number > 12) then
		return nil
	end

	return month_number
end

function invalid_month_message(month)
	return string.format("%s is not a valid month", month)
end

function valid_year(year)
	year_number = tonumber(year)

	if (year_number == nil) then
		return nil
	end

	return year_number
end

function invalid_year_message(year)
	return string.format("%s is not a valid year", year)
end

function next_month(this_month, this_year)
	month = {}

	this_month_number = valid_month(this_month)

	if (not this_month_number) then
		month["month"] = invalid_month_message(this_month)
		month["month_number"] = invalid_month_message(this_month)
	end

	this_year_number = valid_year(this_year)

	if (not this_year_number) then
		month["year"] = invalid_year_message(this_year)
	end

	if (this_month_number == 12) then
		month["month"] = months[1]
		month["month_number"] = 1
		if (this_year_number) then
			month["year"] = this_year_number + 1
		end
	else
		if (this_month_number) then
			next_month_number = this_month_number + 1
			month["month"] = months[next_month_number]
			month["month_number"] = next_month_number
		end
		if (this_year_number) then
			month["year"] = this_year_number
		end
	end

	return month
end

function p.next_month_name(frame)
	this_month = frame.args[1]
	this_year = frame.args[2]
	
	return next_month(this_month, this_year).month
end

function p.next_month_number(frame)
	this_month = frame.args[1]
	this_year = frame.args[2]
	
	return next_month(this_month, this_year).month_number
end

function p.next_month_year(frame)
	this_month = frame.args[1]
	this_year = frame.args[2]
	
	return next_month(this_month, this_year).year
end

function previous_month(this_month, this_year)
	month = {}

	this_month_number = valid_month(this_month)

	if (not this_month_number) then
		month["month"] = invalid_month_message(this_month)
	end

	this_year_number = valid_year(this_year)

	if (not this_year_number) then
		month["year"] = invalid_year_message(this_year)
	end

	if (this_month_number == 1) then
		month["month"] = months[12]
		if (this_year_number) then
			month["year"] = this_year_number - 1
		end
	else
		previous_month_number = this_month_number - 1
		if (this_month_number) then
			month["month"] = months[previous_month_number]
			month["month_number"] = previous_month_number
		end
		if (this_year_number) then
			month["year"] = this_year_number
		end
	end

	return month
end

function p.previous_month_name(frame)
	this_month = frame.args[1]
	this_year = frame.args[2]
	
	return previous_month(this_month, this_year).month
end

function p.previous_month_number(frame)
	this_month = frame.args[1]
	this_year = frame.args[2]
	
	return previous_month(this_month, this_year).month_number
end

function p.previous_month_year(frame)
	this_month = frame.args[1]
	this_year = frame.args[2]
	
	return previous_month(this_month, this_year).year
end

function p.month_number(frame)
	this_month = frame.args[1]

	return month_numbers[this_month]
end

function p.month_number_two_digit(frame)
	this_month = frame.args[1]
	return string.format("%02d", valid_month(this_month))
end

return p