private Schedule GetLessons(HtmlNode schedule) { var lessonsToAddNextHour = new List <MultiHourLesson>(); //Create new schedule and set properties var timeSchedule = new Schedule(); timeSchedule.Identifier = this.Identifier; timeSchedule.Department = this.Department; timeSchedule.Week = this.Week; timeSchedule.QuarterOfYear = this.Quarter; // Loop through each row (row is an hour, e.x. 08:30-09:20) for (int time = 2; time < schedule.ChildNodes.Count; time += 2) { var addMultiHourLesson = false; //Get lessons from current hour var row = schedule.ChildNodes[time]; var lessons = row.ChildNodes.Where(n => n.Name == "td").ToList(); for (int lesson = 1; lesson < lessons.Count; lesson++) { // Get current lesson and info var currentLesson = lessons[lesson]; // Current hour var hourNumber = RemoveChars(lessons[0].InnerText.Split(' ')[0], false); var currentHour = RemoveChars(lessons[0].InnerText.Split(' ')[1], false); // Create lesson and set start time var newLesson = new Lesson(); newLesson.StartTime = currentHour; // If list with HtmlNodes contains key with tuple of current time and lesson, then add lesson of previous hour to this hour if (lessons.Count != 6) { if (lessonsToAddNextHour.FirstOrDefault(q => q.Hour == time && q.Day == lesson) != null || lessonsToAddNextHour.FirstOrDefault(q => q.Hour == (time + 2) && q.Day == lesson) != null) { var previousLesson = lessonsToAddNextHour.FirstOrDefault(q => q.Hour == time && q.Day == lesson) != null ? lessonsToAddNextHour.FirstOrDefault(q => q.Hour == time && q.Day == lesson) : lessonsToAddNextHour.FirstOrDefault(q => q.Hour == (time + 2) && q.Day == lesson); if (previousLesson != null) { lessons.Insert(lesson, previousLesson.Lesson); // Remove lesson from list lessonsToAddNextHour.Remove(previousLesson); // Set multihour lesson to true addMultiHourLesson = true; currentLesson = previousLesson.Lesson; } } } // Set correct identifier of lesson based on schedule type switch (this.ScheduleType) { case "c": timeSchedule.ScheduleType = "Class"; newLesson.Class = timeSchedule.Identifier; break; case "t": timeSchedule.ScheduleType = "Teacher"; newLesson.Teacher = timeSchedule.Identifier; break; case "r": timeSchedule.ScheduleType = "Room"; newLesson.Room = timeSchedule.Identifier; break; } var lessonInfo = ParseHtml(currentLesson); var rowSpan = Convert.ToInt32(currentLesson.Attributes["rowspan"].Value); if (lessonInfo != null) { newLesson = SetLessonInfo(lessonInfo, newLesson, timeSchedule.ScheduleType); // Add lesson to current day if (addMultiHourLesson == true && timeSchedule.Days.FirstOrDefault(q => q.Id == lesson).Lessons .FirstOrDefault(q => q.StartTime == currentHour) == null) { timeSchedule.Days.FirstOrDefault(q => q.Id == lesson).Lessons.Add(newLesson); // Reset multihour lesson addMultiHourLesson = false; // Continue to next day continue; } else if (timeSchedule.Days.FirstOrDefault(q => q.Id == lesson).Lessons .FirstOrDefault(q => q.StartTime == currentHour) == null) { timeSchedule.Days.FirstOrDefault(q => q.Id == lesson).Lessons.Add(newLesson); } // If row span is greater than two, // than the current lesson must be added at the next hour and same day if (rowSpan > 2) { var difference = rowSpan - 2; var totalLoops = difference / 2; for (int j = 1; j < totalLoops + 1; j++) { var nextHour = (2 * j) + time; if (lessonsToAddNextHour.FirstOrDefault(q => q.Lesson == currentLesson && q.Day == lesson && q.Hour == nextHour) == null) { var lessonNextHour = new MultiHourLesson(); lessonNextHour.Day = lesson; lessonNextHour.Hour = nextHour; lessonNextHour.Lesson = currentLesson; lessonsToAddNextHour.Add(lessonNextHour); } } } } } } // If list with multihour lessons is not empty, then add these to the schedule if (lessonsToAddNextHour.Count > 0) { foreach (var lesson in lessonsToAddNextHour) { var hour = lesson.Hour; var day = lesson.Day; var hourString = GetHour(hour); var lessonToInsert = ConvertToLesson(lesson.Lesson, hourString); // Insert lesson at index timeSchedule.Days.FirstOrDefault(q => q.Id == day).Lessons.Insert(((hour / 2) - 1), lessonToInsert); } } return(timeSchedule); }
private void GetLessons(HtmlNode schedule) { // Create list for multihour lessons var lessonsToAddNextHour = new List <MultiHourLesson>(); //Create new schedule and set properties var timeSchedule = new Schedule(); timeSchedule.Department = this.Department; timeSchedule.Week = this.Week; timeSchedule.QuarterOfYear = this.Quarter; // Loop through each row (row is an hour, e.x. 08:30-09:20) for (int time = 2; time < schedule.ChildNodes.Count; time += 2) { var addMultiHourLesson = false; // Get hour //Get lessons from current hour var row = schedule.ChildNodes[time]; var lessons = row.ChildNodes.Where(n => n.Name == "td").ToList(); for (int lesson = 1; lesson < lessons.Count; lesson++) { // Get current hour var hourNumber = RemoveChars(lessons[0].InnerText.Split(' ')[0]); var currentHour = RemoveChars(lessons[0].InnerText.Split(' ')[1]); // Create new lesson and set start time var newLesson = new Lesson(lesson); newLesson.StartTime = currentHour; // Get current lesson and info var currentLesson = lessons[lesson]; // If contains key with tuple time and lesson, then add lesson of previous hour to this hour if (lessons.Count != 6) { var id = String.Format("{0}{1}", time, lesson); if (lessonsToAddNextHour.FirstOrDefault(q => q.Hour == time && q.Day == lesson && q.Id == id) != null) { var previousLesson = lessonsToAddNextHour.FirstOrDefault(q => q.Hour == time && q.Day == lesson && q.Id == id); if (previousLesson != null) { lessons.Insert(lesson, previousLesson.Lesson); // Remove lesson from list lessonsToAddNextHour.Remove(previousLesson); // Set multihour lesson to true addMultiHourLesson = true; currentLesson = previousLesson.Lesson; } } } // Get lesson and info var lessonInfo = currentLesson.SelectSingleNode("table").ChildNodes.Descendants("font").ToList(); // Get lesson row span var rowSpan = Convert.ToInt32(currentLesson.Attributes["rowspan"].Value); if (lessonInfo != null) { // Set lesson properties switch (lessonInfo.Count) { case 0: newLesson.Course = "Geen les"; newLesson.Class = String.Empty; newLesson.Teacher = String.Empty; break; case 1: newLesson.Course = RemoveChars(lessonInfo[0].InnerText); newLesson.Class = String.Empty; newLesson.Teacher = String.Empty; break; case 2: newLesson.Course = RemoveChars(lessonInfo[1].InnerText); newLesson.Class = RemoveChars(lessonInfo[0].InnerText); newLesson.Teacher = String.Empty; break; case 3: newLesson.Course = RemoveChars(lessonInfo[2].InnerText); newLesson.Class = RemoveChars(lessonInfo[0].InnerText); newLesson.Teacher = RemoveChars(lessonInfo[1].InnerText); break; } // Add lesson to current day if (addMultiHourLesson == true && timeSchedule.Days.FirstOrDefault(q => q.Id == lesson).Lessons .FirstOrDefault(q => q.StartTime == currentHour) == null) { timeSchedule.Days.FirstOrDefault(q => q.Id == lesson).Lessons.Add(newLesson); // Reset multihour lesson addMultiHourLesson = false; // Continue to next day continue; } else if (timeSchedule.Days.FirstOrDefault(q => q.Id == lesson).Lessons .FirstOrDefault(q => q.StartTime == currentHour) == null) { timeSchedule.Days.FirstOrDefault(q => q.Id == lesson).Lessons.Add(newLesson); } // If row span is greater than two, // than the current lesson must be added at the next hour and same day if (rowSpan > 2) { var difference = rowSpan - 2; var totalLoops = difference / 2; for (int j = 1; j < totalLoops + 1; j++) { var nextHour = (2 * j) + time; if (lessonsToAddNextHour.FirstOrDefault(q => q.Lesson == currentLesson && q.Day == lesson && q.Hour == nextHour) == null) { var lessonNextHour = new MultiHourLesson(); lessonNextHour.Id = String.Format("{0}{1}", nextHour, lesson); lessonNextHour.Day = lesson; lessonNextHour.Hour = nextHour; lessonNextHour.Lesson = currentLesson; lessonsToAddNextHour.Add(lessonNextHour); } } } } } } // If list with multihour lessons is not empty, then add these to the schedule if (true) { foreach (var lesson in lessonsToAddNextHour) { var hour = lesson.Hour; var day = lesson.Day; var hourString = GetHour(hour); var lessonToInsert = ConvertToLesson(lesson.Lesson, hourString); // Insert lesson at index timeSchedule.Days.FirstOrDefault(q => q.Id == day).Lessons.Insert(((hour / 2) - 1), lessonToInsert); } } Print(timeSchedule); }