Skip to content

Instantly share code, notes, and snippets.

@imh
Created June 16, 2012 05:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save imh/2940082 to your computer and use it in GitHub Desktop.
Save imh/2940082 to your computer and use it in GitHub Desktop.
vertical calendar
#!/usr/bin/env ruby
require 'Date'
ABBR_DAYNAMES = {0, 'Su', 1, 'Mo', 2, 'Tu', 3, 'We', 4, 'Th', 5, 'Fr', 6, 'Sa'}
ABBR_MONAMES = {1, 'Jan', 2, 'Feb', 3, 'Mar', 4, 'Apr', 5, 'May', 6, 'Jun', 7, 'Jul', 8, 'Aug', 9, 'Sep', 10, 'Oct', 11, 'Nov', 12, 'Dec'}
def days_in_month(year, month)
if month < 13 then
if month > 0 then
return (Date.new(year, 12, 31) << (12 - month)).day
else
return days_in_month(year-1, month+12)
end
else
return days_in_month(year+1,month-12)
end
end
def wday_in_month(year, month, day)
if month < 13 then
if month > 0 then
if day <= days_in_month(year,month) then
if day > 0 then
return Date.new(year, month, day).wday
else
return wday_in_month(year, month-1, day+days_in_month(year, month-1))
end
else
return wday_in_month(year, month+1, day-days_in_month(year, month))
end
else
return wday_in_month(year-1,month+12,day)
end
else
return wday_in_month(year+1,month-12,day)
end
end
def day_in_month(year, month, day)
if month < 13 then
if month > 0 then
if day <= days_in_month(year,month) then
if day > 0 then
return Date.new(year, month, day).day
else
return day_in_month(year, month-1, day+days_in_month(year, month-1))
end
else
return day_in_month(year, month+1, day-days_in_month(year, month))
end
else
return day_in_month(year-1,month+12,day)
end
else
return day_in_month(year+1,month-12,day)
end
end
def build_big_daydate_array(year, month, fl, num)
if month < 13 then
if month > 0 then
if num > days_in_month(year, month) then
if fl == 1 then
return {build_big_daydate_array(year, month, fl, days_in_month(year,month)), build_big_daydate_array(year, month+1, fl, num-days_in_month(year, month))}
else
return {build_big_daydate_array(year, month-1, fl, num-days_in_month(year, month)), build_big_daydate_array(year, month, fl, days_in_month(year, month))}
end
else
return build_daydate_array(year, month, fl, num)
end
else
return build_big_daydate_array(year-1,month+12, fl, num)
end
else
return build_big_daydate_array(year+1,month-12, fl, num)
end
end
def build_full_daydate_array(year, month, before, after)
td = Time.now.day
if after <= (days_in_month(year, month)-td) then
if before < td then
dd_array = build_big_daydate_array(year, month, 1, td+after)
for d in (1..(td-before))
dd_array.shift
end
return dd_array
else
return {build_big_daydate_array(year, month-1, -1, before-td), build_big_daydate_array(year, month, 1, after+td)}
end
else
return {build_big_daydate_array(year, month, -1, before-td+days_in_month(year, month)), build_big_daydate_array(year, month+1, 1, after - days_in_month(year, month)+td)}
end
end
def build_daydate_array(year, month, fl, num)
color1 = "\e[34m"
color2 = "\e[36m"
# 30 is black
# 31 is red
# 32 is green
# 33 is yellow
# 34 is blue
# 35 is magenta
# 36 is cyan
# 37 is white
close = "\e[0m" # don't change this
day_array = Array.new
daydate_array = Array.new
td = Time.now.day
tw = ABBR_DAYNAMES[Time.now.wday]
moname = ABBR_MONAMES[month]
dimo = days_in_month(year, month)
if fl == 1 then
nd = num
else
nd = days_in_month(year, month)
end
for d in (1..nd)
daydate_array[d] = day_in_month(year, month, d)
dayname = ABBR_DAYNAMES[wday_in_month(year, month, d)]
if dayname == tw then
day_array[d] = "#{color2}#{dayname}#{close}"
else
day_array[d] = "#{dayname}"
end
end
day_array.shift
daydate_array.shift
daydate_array.each do |d|
g = day_array[(d-1)]
if year == Time.now.year && month == Time.now.month && d == Time.now.day then
if d < 10 then
if d == 1 then
daydate_array[(d-1)] = "#{moname}-#{color1}#{d}#{close} #{g}\n"
else
daydate_array[(d-1)] = " #{color1}#{d}#{close} #{g}\n"
end
else
if d == days_in_month(year, month) then
daydate_array[(d-1)] = "#{moname}#{color1}#{d}#{close} #{g}\n"
else
daydate_array[(d-1)] = " #{color1}#{d}#{close} #{g}\n"
end
end
else
if d < 10 then
if d == 1 then
daydate_array[(d-1)] = "#{moname}-#{d} #{g}\n"
else
daydate_array[(d-1)] = " #{d} #{g}\n"
end
else
if d == days_in_month(year, month) then
daydate_array[(d-1)] = "#{moname}#{d} #{g}\n"
else
daydate_array[(d-1)] = " #{d} #{g}\n"
end
end
end
end
if fl == 1 || num == days_in_month(year,month) then
return daydate_array
else
for d in (1..(days_in_month(year, month)-num))
daydate_array.shift
end
return daydate_array
end
end
year = Time.now.year
month = Time.now.month
puts build_full_daydate_array(year, month, 40, 60)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment