extractModul function

CalendarEvent? extractModul(
  1. Bs4Element element, {
  2. DateTime? day,
})

Implementation

CalendarEvent? extractModul(Bs4Element element, {DateTime? day}) {
  day = day ?? DateTime.now();
  CalendarEventType type = CalendarEventType.regular;
  String status = "Uændret";
  String? id = queriesFromSoup(element.getAttrValue('href') ?? "")['absid'];
  if (id == null) {
    type = CalendarEventType.test;
    id = queriesFromSoup(element.getAttrValue('href') ?? "")['ProeveholdId'];
  }
  if (id == null) {
    type = CalendarEventType.private;
    id = queriesFromSoup(element.getAttrValue('href') ?? "")['aftaleid'];
  }
  bool hasHomework = false;
  bool hasNote = false;
  if (type == CalendarEventType.regular) {
    Bs4Element? homeworkIcon = element.find('*', class_: 'ls-lektier');
    Bs4Element? noteIcon = element.find('*', class_: 'ls-note');
    hasHomework = homeworkIcon != null;
    hasNote = noteIcon != null;
  }
  String title = "";
  DateTime? start;
  DateTime? end;
  String team = "";
  String room = "";
  List<String> teacher = [];
  String note = "";
  List<String> pieceInformation =
      (element.getAttrValue('data-tooltip')?.split("\n") ?? []);

  // check for title and timestamps
  for (var pieceInfo in pieceInformation) {
    var dates = datePattern.allMatches(pieceInfo);
    var times = timePattern.allMatches(pieceInfo);

    if (times.isNotEmpty && start == null && end == null) {
      if (dates.isNotEmpty) {
        String startTime =
            "${regToStr(dates.elementAt(0))} ${regToStr(times.elementAt(0))}";
        String endTime =
            "${regToStr(dates.length > 1 ? dates.elementAt(1) : dates.elementAt(0))} ${regToStr(times.elementAt(1))}";
        DateFormat format = DateFormat("d/M-y HH:mm");
        start = format.parse(startTime);
        end = format.parse(endTime);
      } else {
        if (times.length >= 2) {
          DateFormat hhMM = DateFormat("HH:mm");
          var startHHmm = hhMM.parse(regToStr(times.elementAt(0)));
          var endHHmm = hhMM.parse(regToStr(times.elementAt(1)));
          start = day.copyWith(hour: startHHmm.hour, minute: startHHmm.minute);
          end = day.copyWith(hour: endHHmm.hour, minute: endHHmm.minute);
        }
      }
    } else if (states.contains(pieceInfo)) {
      status = pieceInfo;
    }
  }

  // extract all named info
  for (var namedInfo in pieceInformation) {
    List<String> data = namedInfo.split(":");
    if (data.length >= 2) {
      switch (data[0]) {
        case "Hold":
          team = data[1].trim();
          break;
        case "Lærer":
          teacher = extractTeachers(data[1]);
          break;
        case "Lærere":
          teacher = extractTeachers(data[1]);
          break;
        case "Lokale":
          room = data[1].trim();
          break;
        case "Lokaler":
          room = data[1].trim();
          break;
        case "Note":
          var index = pieceInformation.indexOf(namedInfo);
          if (index < pieceInformation.length - 1) {
            note = pieceInformation
                .sublist(index, pieceInformation.length)
                .join("\n")
                .replaceFirst('Note:', "")
                .trim();
          }
          break;
      }
    }
  }

  // extract teacher and team objects
  List<MetaDataEntry> teacherObjs = [];
  List<MetaDataEntry> teamObjs = [];
  Bs4Element? skemaContent = element.find('*', class_: 's2skemabrikcontent');
  if (skemaContent != null) {
    List<Bs4Element> dataSpans = skemaContent.findAll('span');
    for (var dataSpan in dataSpans) {
      var contextId = dataSpan.getAttrValue("data-lectiocontextcard");
      if (contextId != null) {
        var entry = MetaDataEntry(id: contextId, name: dataSpan.text);
        if (contextId.startsWith("T")) {
          teacherObjs.add(entry);
        }
        if (contextId.startsWith("HE")) {
          teamObjs.add(entry);
        }
      }
    }
  }

  if (pieceInformation.isNotEmpty && pieceInformation[0].isNotEmpty) {
    if (!states.contains(pieceInformation[0]) &&
        timePattern.allMatches(pieceInformation[0]).isEmpty) {
      title = pieceInformation[0];
    }
  }

  if (start != null && end != null) {
    return CalendarEvent(
        hasHomework: hasHomework,
        hasNote: hasNote,
        status: status,
        title: title,
        team: team,
        teachers: teacher,
        room: room,
        id: id ?? "",
        start: start,
        end: end,
        type: type,
        note: note,
        teacherObjs: teacherObjs,
        teamObjs: teamObjs);
  }
  return null;
}