From 58eb217ab7ec96d85b10b278c034478575692ff9 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Thu, 28 Feb 2019 14:52:40 +0100 Subject: [PATCH] added a new timetable parser implementation * added supports for multiple lessons per slot * added support for lessons which take 2 slots --- .../mosad/seil0/projectlaogai/MainActivity.kt | 1 + .../projectlaogai/hsoparser/DataTypes.kt | 10 +- .../hsoparser/TimeTableParser.kt | 92 +++++++++++++++++++ 3 files changed, 100 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt index 3728b77..7d32354 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt @@ -183,6 +183,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte val jobTTCurrentWeek = doAsync { try { cTimeTableCurrentWeek = timeTableParser.getTimeTable(cCourse.courseLink) + timeTableParser.printTimeTableWeek(cTimeTableCurrentWeek) } catch (e: Exception) { uiThread { diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/DataTypes.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/DataTypes.kt index 1cf8655..b2e8cd3 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/DataTypes.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/DataTypes.kt @@ -56,8 +56,12 @@ class NotRetardedCalendar { } -data class Lesson(val lessonSubject: String, val lessonTeacher: String, val lessonRoom:String, val lessonRemark: String) - data class Course(val courseLink: String, val courseName: String) -data class Meal(val day: String, val heading: String, val parts: ArrayList, val additives: String) \ No newline at end of file +data class Meal(val day: String, val heading: String, val parts: ArrayList, val additives: String) + +data class Lesson(val lessonSubject: String, val lessonTeacher: String, val lessonRoom:String, val lessonRemark: String) + +data class TimeTableDay( var timeslot: Array> = Array(6) { ArrayList()}) + +data class TimeTable(var day: Array = Array(6) { TimeTableDay() }) \ No newline at end of file diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/TimeTableParser.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/TimeTableParser.kt index 4f7de01..26fabcd 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/TimeTableParser.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/TimeTableParser.kt @@ -49,7 +49,56 @@ class TimeTableParser { //val week = scheduleHTML.select("h1.timetable-caption").text() //println("$week successful!\n") + val rows= scheduleHTML.select("table.timetable").select("tr[scope=\"row\"]") + var timeTableWeekTEST = TimeTable() + var sDay = -1 + var sRow = -1 + var sLesson = Lesson("", "", "", "") + + // get each row with index, reflects 1 timeslot per day + for ((rowIndex, row) in rows.withIndex()) { + var day = 0 + + row.select("td.lastcol, td[style]").forEach { element -> + // elements are now all lessons, including empty ones + + //println("-------------> Element (Day.Timeslot: " + day + "." + rowIndex + "): " + element) + //println("Day.Timeslot: " + day + "." + rowIndex + " lesson: " + element.select("div.lesson-subject").text() + ", " + element.select("div.lesson-teacher").text()) + + // if there is a lecture with rowspan="2", we need to shift everything by one to the left. This is stupid and ugly there needs to bee an API + if ((sDay > -1 && sRow > -1) && (sDay == day && ((sRow + 1) == rowIndex))) { + // we found a lecture that is longer than 1 lesson + timeTableWeekTEST.day[day].timeslot[rowIndex].add(sLesson) // this just works if there is one lecture per slot + + // adjust the following slot + sDay++ + sLesson = Lesson(element.select("div.lesson-subject").text(), element.select("div.lesson-teacher").text(), element.select("div.lesson-room").text(), element.select("div.lesson-remark").text()) + + // adjust the slot directly as we don't get there anymore + if(sDay == 5) { + timeTableWeekTEST.day[day + 1].timeslot[rowIndex].add(sLesson) + } + + } else { + timeTableWeekTEST.day[day].timeslot[rowIndex].add(Lesson(element.select("div.lesson-subject").text(), element.select("div.lesson-teacher").text(), element.select("div.lesson-room").text(), element.select("div.lesson-remark").text())) + } + + // we found a lecture with rowspan="2", save day, row and lesson for later adjustment + if(element.toString().contains("rowspan=\"2\"")) { + sDay = day + sRow = rowIndex + sLesson = timeTableWeekTEST.day[day].timeslot[rowIndex].get(index = 0) + } + + if(element.hasClass("lastcol")) day++ + } + + } + + printTimeTableWeekNew(timeTableWeekTEST) + scheduleHTML.select("table.timetable").select("td.lastcol").forEachIndexed { index, element -> + //println("Index: " + index + " lesson: " + element.select("div.lesson-subject").text() + ", " + element.select("div.lesson-teacher").text()) timeTableWeek[index % 6][index / 6] = Lesson(element.select("div.lesson-subject").text(), element.select("div.lesson-teacher").text(), element.select("div.lesson-room").text(), element.select("div.lesson-remark").text()) } @@ -86,7 +135,50 @@ class TimeTableParser { for (j in 0..5) print("-".padEnd(26 + (j.toFloat().div(j).toInt()), '-') + "+") println() } + println(" \n") + } + + fun printTimeTableWeekNew(timetable: TimeTable) { + for (j in 0..5) print(days[j].padEnd(75 ,' ') + " | ") println() + for (j in 0..5) print("-".padEnd(76 + (j.toFloat().div(j).toInt()), '-') + "+") + println() + + // the timeslot + for (i in 0..5) { + + for (j in 0..5) { + val ldiff = if (timetable.day[j].timeslot[i].size == 0) 1 else timetable.day[j].timeslot[i].size + + for (lesson in timetable.day[j].timeslot[i]) print(lesson.lessonSubject.padEnd(75/ldiff ,' ')) + if (ldiff == 2) print(" ") + print(" | ") + } + println() + + for (j in 0..5) { + val ldiff = if (timetable.day[j].timeslot[i].size == 0) 1 else timetable.day[j].timeslot[i].size + + for (lesson in timetable.day[j].timeslot[i]) print(lesson.lessonTeacher.padEnd(75/ldiff ,' ')) + if (ldiff == 2) print(" ") + print(" | ") + } + println() + + for (j in 0..5) { + val ldiff = if (timetable.day[j].timeslot[i].size == 0) 1 else timetable.day[j].timeslot[i].size + + for (lesson in timetable.day[j].timeslot[i]) print(lesson.lessonRoom.padEnd(75/ldiff ,' ')) + if (ldiff == 2) print(" ") + print(" | ") + } + println() + + for (j in 0..5) print("-".padEnd(76 + (j.toFloat().div(j).toInt()), '-') + "+") + println() + } + + println(" \n") } } \ No newline at end of file