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
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