class Xcal::Xcal
Constants
- BLUE
- CLEAR
- ICS_URL
- MONTH
- MONTH_DAY
- MONTH_TEMPLATE
- RED
- REVERSE
- ROWS
- SPACE
- WEEK
Public Instance Methods
blue(str)
click to toggle source
# File lib/xcal/xcal.rb, line 11 def blue(str) BLUE + str + CLEAR end
cal3()
click to toggle source
# File lib/xcal/xcal.rb, line 129 def cal3 origin_date = Date.today print_3month_calendar(origin_date) end
cal9()
click to toggle source
# File lib/xcal/xcal.rb, line 135 def cal9 [-3, 0, 3].each do |offset_month| origin_date = Date.today >> (offset_month) print_3month_calendar(origin_date) end end
fetch_holidays_from_remote_ics(ics_url)
click to toggle source
# File lib/xcal/xcal.rb, line 47 def fetch_holidays_from_remote_ics(ics_url) holidays = {} ical = URI.open(ics_url){|f| f.read} cals = Icalendar::Calendar.parse(ical) cals.each{|cal| cal.events.each{|event| start = event.dtstart y = start.year m = start.month d = start.day holidays[y] = {} unless holidays[y] holidays[y][m] = {} unless holidays[y][m] holidays[y][m][d] = {holiday: true, date: Date.new(y, m, d), summary: event.summary} } } holidays end
fill_calendar(year, month, table, month_offset, holidays, today)
click to toggle source
# File lib/xcal/xcal.rb, line 68 def fill_calendar(year, month, table, month_offset, holidays, today) offset = Date.new(year, month, 1).wday - 1 month_day = get_month_day(year, month) (1..month_day).each{|d| date = Date.new(year, month, d) day = sprintf('%2d', d) if is_holiday?(year, month, d, holidays) day = red(day) elsif date.wday == 6 day = blue(day) elsif date.wday == 0 day = red(day) end if today == date day = reverse(day) end table[(offset + d) / 7][month_offset + date.wday] = day } end
get_month_day(y, m)
click to toggle source
# File lib/xcal/xcal.rb, line 99 def get_month_day(y, m) day = MONTH_DAY[m - 1] if m == 2 and Date.leap?(y) day += 1 end day end
header()
click to toggle source
# File lib/xcal/xcal.rb, line 43 def header [red('Su'), 'Mo', 'Tu', 'We', 'Th', 'Fr', blue('Sa')] end
is_holiday?(y, m, d, holidays)
click to toggle source
# File lib/xcal/xcal.rb, line 91 def is_holiday?(y, m, d, holidays) holidays[y] and holidays[y][m] and holidays[y][m][d] and holidays[y][m][d][:holiday] end
list_holidays(first, last)
click to toggle source
# File lib/xcal/xcal.rb, line 172 def list_holidays(first, last) holidays = (first..last).each_with_object([]){|date, memo| y = date.year m = date.month d = date.day memo << @holidays[y][m][d] if @holidays[y] && @holidays[y][m] && @holidays[y][m][d] } holidays.each{|holiday| puts "#{holiday[:date].strftime("%Y-%m-%d")} (#{header[holiday[:date].wday]}) #{holiday[:summary]}" } end
main(argv)
click to toggle source
# File lib/xcal/xcal.rb, line 107 def main(argv) @holidays = fetch_holidays_from_remote_ics(ICS_URL) if argv.include?('-9') cal9 else cal3 end if argv.include?('-l') if argv.include?('-9') first = (Date.today << 4) - (Date.today.day - 1) last = (Date.today >> 5) - Date.today.day else first = (Date.today << 1) - (Date.today.day - 1) last = (Date.today >> 2) - Date.today.day end list_holidays(first, last) end end
month_header(y, m)
click to toggle source
# File lib/xcal/xcal.rb, line 95 def month_header(y, m) MONTH_TEMPLATE[m - 1].sub('%', sprintf('%4d', y)) end
print_3month_calendar(origin_date)
click to toggle source
# File lib/xcal/xcal.rb, line 143 def print_3month_calendar(origin_date) table = Array.new(ROWS){ Array.new(WEEK * MONTH + SPACE){|i| (i + 1) % 8 == 0 ? '' : ' ' } } today = Date.today last_month = origin_date << 1 next_month = origin_date >> 1 fill_calendar(last_month.year, last_month.month, table, 0, @holidays, today) fill_calendar(origin_date.year, origin_date.month, table, 8, @holidays, today) fill_calendar(next_month.year, next_month.month, table, 16, @holidays, today) month_headers = [ month_header(last_month.year, last_month.month), month_header(origin_date.year, origin_date.month), month_header(next_month.year, next_month.month) ] puts month_headers.join(' ') puts header.join(' ') + ' ' + header.join(' ') + ' ' + header.join(' ') table.each{|row| puts row.join(' ') } end
red(str)
click to toggle source
# File lib/xcal/xcal.rb, line 7 def red(str) RED + str + CLEAR end
reverse(str)
click to toggle source
# File lib/xcal/xcal.rb, line 15 def reverse(str) REVERSE + str + CLEAR end