184 lines
7.6 KiB
Kotlin
184 lines
7.6 KiB
Kotlin
/**
|
|
* ProjectLaogai
|
|
*
|
|
* Copyright 2019 <seil0@mosad.xyz>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
* MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
|
|
package org.mosad.seil0.projectlaogai.hsoparser
|
|
|
|
import org.jsoup.Jsoup
|
|
|
|
class TimeTableParser {
|
|
private val days = arrayOf("Monday", "Tuesday" ,"Wednesday", "Thursday", "Friday", "Saturday")
|
|
private var courseTTLinkList = ArrayList<Course>()
|
|
|
|
/**
|
|
* get the timetable from the given url
|
|
* the timetable is organised per row not per column;
|
|
* Mon 1, Tue 1, Wed 1, Thur 1, Fri 1, Sat 1, Mon 2 and so on
|
|
*/
|
|
fun getTimeTable(courseTTURL: String): TimeTable {
|
|
var timeTableWeek = TimeTable() // this must be a var!
|
|
val scheduleHTML = Jsoup.connect(courseTTURL).get()
|
|
|
|
// create the timetable array
|
|
/* for (i in 0..5) {
|
|
var timeTableDay = arrayOf<Lesson>()
|
|
for (j in 0..5) {
|
|
timeTableDay += Lesson("", "","","")
|
|
}
|
|
timeTableWeek += timeTableDay
|
|
}*/
|
|
|
|
//val week = scheduleHTML.select("h1.timetable-caption").text()
|
|
//println("$week successful!\n")
|
|
|
|
val rows= scheduleHTML.select("table.timetable").select("tr[scope=\"row\"]")
|
|
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
|
|
timeTableWeek.days[day].timeslots[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) {
|
|
timeTableWeek.days[day + 1].timeslots[rowIndex].add(sLesson)
|
|
}
|
|
|
|
} else {
|
|
timeTableWeek.days[day].timeslots[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 = timeTableWeek.days[day].timeslots[rowIndex].get(index = 0)
|
|
}
|
|
|
|
if(element.hasClass("lastcol")) day++
|
|
}
|
|
|
|
}
|
|
|
|
printTimeTableWeek(timeTableWeek)
|
|
|
|
/*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())
|
|
}*/
|
|
|
|
return timeTableWeek
|
|
}
|
|
|
|
/**
|
|
* parse all courses from the courses site at https://www.hs-offenburg.de/studium/vorlesungsplaene/
|
|
*/
|
|
fun getCourseTTLinks(): ArrayList<Course> {
|
|
val courseHTML = Jsoup.connect("https://www.hs-offenburg.de/studium/vorlesungsplaene/").get()
|
|
|
|
courseHTML.select("ul.index-group").select("li.Class").select("a[href]").forEachIndexed { _, element ->
|
|
courseTTLinkList.add(Course(element.attr("href").replace("http", "https"),element.text()))
|
|
}
|
|
return courseTTLinkList
|
|
}
|
|
|
|
@Suppress("unused")
|
|
fun printTimeTableWeekOLD (timeTableWeek: Array<Array<Lesson>>) {
|
|
|
|
for (j in 0..5) print(days[j].padEnd(25 ,' ') + " | ")
|
|
println()
|
|
for (j in 0..5) print("-".padEnd(26 + (j.toFloat().div(j).toInt()), '-') + "+")
|
|
println()
|
|
|
|
for (i in 0..5) {
|
|
for (j in 0..5) print(timeTableWeek[j][i].lessonSubject.padEnd(25 ,' ').substring(0,25) + " | ")
|
|
println()
|
|
for (j in 0..5) print(timeTableWeek[j][i].lessonTeacher.padEnd(25 ,' ').substring(0,25) + " | ")
|
|
println()
|
|
for (j in 0..5) print(timeTableWeek[j][i].lessonRoom.padEnd(25 ,' ').substring(0,25) + " | ")
|
|
println()
|
|
for (j in 0..5) print("-".padEnd(26 + (j.toFloat().div(j).toInt()), '-') + "+")
|
|
println()
|
|
}
|
|
println(" \n")
|
|
}
|
|
|
|
@Suppress("unused")
|
|
fun printTimeTableWeek(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.days[j].timeslots[i].size == 0) 1 else timetable.days[j].timeslots[i].size
|
|
|
|
for (lesson in timetable.days[j].timeslots[i]) print(lesson.lessonSubject.padEnd(75/ldiff ,' '))
|
|
if (ldiff == 2) print(" ")
|
|
print(" | ")
|
|
}
|
|
println()
|
|
|
|
for (j in 0..5) {
|
|
val ldiff = if (timetable.days[j].timeslots[i].size == 0) 1 else timetable.days[j].timeslots[i].size
|
|
|
|
for (lesson in timetable.days[j].timeslots[i]) print(lesson.lessonTeacher.padEnd(75/ldiff ,' '))
|
|
if (ldiff == 2) print(" ")
|
|
print(" | ")
|
|
}
|
|
println()
|
|
|
|
for (j in 0..5) {
|
|
val ldiff = if (timetable.days[j].timeslots[i].size == 0) 1 else timetable.days[j].timeslots[i].size
|
|
|
|
for (lesson in timetable.days[j].timeslots[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")
|
|
}
|
|
|
|
} |