class Martlet::ScheduleParser
Public Class Methods
new(html)
click to toggle source
# File lib/martlet/schedule_parser.rb, line 5 def initialize(html) @html = html end
Public Instance Methods
parse_courses()
click to toggle source
# File lib/martlet/schedule_parser.rb, line 9 def parse_courses document = Nokogiri::HTML(@html) course_tables = document.search("br+table[@class='datadisplaytable']") course_times = document.search("br+table[@class='datadisplaytable']+table tr") course_times = split_course_times(course_times) courses = course_tables.map.with_index do |table, index| course_name_info = table.search('caption').first course_name_info = course_name_info.text.split(' - ') course_name = course_name_info[0] course_number = course_name_info[1] course_data = table.search('tr td').map { |d| d.text.strip } course_time_info = course_times[index].map do |course_time| course_time.search('td').map { |d| d.text.strip } end meetings = course_time_info.map do |course_time| start_time, end_time = parse_time_range(course_time[0]) start_date, end_date = parse_date_range(course_time[3]) days = parse_days(course_time[1]) CourseMeeting.new({ start_time: start_time, end_time: end_time, start_date: start_date, end_date: end_date, days: days, location: course_time[2] }) end Course.new({ name: course_name, number: course_number, term: course_data[0], crn: course_data[1], instructor: course_data[3], credits: course_data[5], level: course_data[6], campus: course_data[7], meetings: meetings }) end end
Private Instance Methods
headers?(row)
click to toggle source
# File lib/martlet/schedule_parser.rb, line 69 def headers?(row) !row.search('th').empty? end
parse_date_range(date_range)
click to toggle source
# File lib/martlet/schedule_parser.rb, line 78 def parse_date_range(date_range) dates = date_range.scan(/\w+\s\d+,\s\d+/) dates.map { |date| Date.parse(date) } end
parse_days(days)
click to toggle source
# File lib/martlet/schedule_parser.rb, line 83 def parse_days(days) days.split('').map { |letter| day_from_letter(letter) } end
parse_time_range(time_range)
click to toggle source
# File lib/martlet/schedule_parser.rb, line 73 def parse_time_range(time_range) times = time_range.scan(/\d+:\d+\s[AP]M/) times.map { |time| Time.parse(time) } end
split_course_times(course_times)
click to toggle source
# File lib/martlet/schedule_parser.rb, line 57 def split_course_times(course_times) split = [] course_times.each do |info| if headers?(info) split << [] else split.last << info end end split end