129 lines
3.5 KiB
Java
129 lines
3.5 KiB
Java
package xyz.thastertyn.Scrape;
|
|
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.util.regex.Pattern;
|
|
|
|
import org.jsoup.nodes.Document;
|
|
import org.jsoup.nodes.Element;
|
|
import org.jsoup.select.Elements;
|
|
|
|
import xyz.thastertyn.Types.Choice;
|
|
import xyz.thastertyn.Types.FinalMark;
|
|
import xyz.thastertyn.Types.Option;
|
|
import xyz.thastertyn.Types.Options;
|
|
import xyz.thastertyn.Types.Subject;
|
|
import xyz.thastertyn.Types.Mark;
|
|
|
|
public class Marks extends JecnaScrape {
|
|
|
|
// schoolYear, schoolYearId
|
|
private ArrayList<Subject> subjects;
|
|
|
|
// int znaci id roku, boolean jestli je jen prvni nebo i druhe pololeti
|
|
private Options schoolYearOptions;
|
|
private Options schoolHalfYearOptions;
|
|
|
|
public void download() throws IOException
|
|
{
|
|
download("https://www.spsejecna.cz/score/student");
|
|
}
|
|
|
|
@Override
|
|
public void download(Choice choice) throws IOException
|
|
{
|
|
download(String.format(
|
|
"https://www.spsejecna.cz/score/student?schoolYearId=%s&schoolYearHalfId=%s",
|
|
choice.getChoices().get(0),
|
|
choice.getChoices().get(1)));
|
|
}
|
|
|
|
private void download(String url) throws IOException
|
|
{
|
|
schoolHalfYearOptions = new Options("Pololeti");
|
|
schoolYearOptions = new Options("Skolni R.");
|
|
|
|
subjects = new ArrayList<>();
|
|
Document marksHTMLDocument = Downloader.download(url);
|
|
|
|
// Subjects stored as <tr>
|
|
Elements[] subjectRowsHTML = marksHTMLDocument
|
|
.select("table.score")
|
|
.select("tr")
|
|
.stream()
|
|
.map(Element::children)
|
|
.toArray(Elements[]::new);
|
|
|
|
int subjectIndex = 0;
|
|
|
|
for(int i = 1; i < subjectRowsHTML.length; i++)
|
|
{
|
|
String fullSubjectName = subjectRowsHTML[i].get(0).text();
|
|
|
|
// Attempt to shorten the subject name to the string in brackets
|
|
String shortSubjectName = Pattern
|
|
.compile("\\((.*?)\\)")
|
|
.matcher(fullSubjectName)
|
|
.results()
|
|
.findFirst()
|
|
.map(m -> m.group(1))
|
|
.orElse(fullSubjectName);
|
|
|
|
if(subjectRowsHTML[i].get(2).childrenSize() == 0) // Subject doesn't have final mark yet
|
|
{
|
|
subjects.add(new Subject(shortSubjectName));
|
|
}else{
|
|
String finalMark = subjectRowsHTML[i].get(2).select("a.scoreFinal").text();
|
|
subjects.add(new Subject(shortSubjectName, FinalMark.fromValue(finalMark)));
|
|
}
|
|
|
|
for(Element znamkaElement : subjectRowsHTML[i].get(1).select("a.score"))
|
|
{
|
|
int mark;
|
|
boolean isSmall = false;
|
|
|
|
String markText = znamkaElement.select("span.value").text();
|
|
|
|
mark = markText.matches("\\d") ?
|
|
Integer.parseInt(markText)
|
|
:
|
|
-1; // Most likely N (Nehodnocen)
|
|
|
|
// Small mark will be counted with smaller weight, compared to normal one
|
|
isSmall = znamkaElement.hasClass("scoreSmall");
|
|
|
|
subjects.get(subjectIndex).addMark(new Mark(mark, isSmall, markText));
|
|
}
|
|
|
|
subjectIndex++;
|
|
}
|
|
|
|
Element optionsPanel = marksHTMLDocument.selectFirst("form.listConfigure");
|
|
|
|
Elements schoolYears = optionsPanel.select("select[id=schoolYearId]").select("option");
|
|
Elements halfYears = optionsPanel.select("select[id=schoolYearHalfId]").select("option");
|
|
|
|
|
|
for(Element e : schoolYears)
|
|
{
|
|
boolean isDefault = e.hasAttr("selected");
|
|
schoolYearOptions.addOption(new Option(e.text(), e.attr("value"), isDefault));
|
|
}
|
|
|
|
for(Element e : halfYears)
|
|
{
|
|
boolean isDefault = e.hasAttr("selected");
|
|
schoolHalfYearOptions.addOption(new Option(e.text(), e.attr("value"), isDefault));
|
|
}
|
|
}
|
|
|
|
public ArrayList<Subject> getSubjects()
|
|
{
|
|
return subjects;
|
|
}
|
|
|
|
public Options[] getOptions()
|
|
{
|
|
return new Options[] {schoolYearOptions, schoolHalfYearOptions};
|
|
}
|
|
} |