Files
HiddingselAppOriginal/lib/todo/parser.dart
2026-02-13 15:53:22 +01:00

144 lines
5.9 KiB
Dart

import 'package:hiddingsel_app/appflow/model/event_organisations.dart';
import 'package:hiddingsel_app/appflow/model/location.dart';
import '../constants/enums.dart';
import '../appflow/model/contacts.dart';
import '../appflow/model/event.dart';
import '../appflow/model/schedules.dart';
class IcalParser {
static List<EventModel> parse(String data) {
final regex = RegExp('BEGIN:VEVENT(.*?)END:VEVENT', dotAll: true);
return regex
.allMatches(data)
.map((e) => e.group(0))
.map((e) => _parseToEvent(e!))
.where((e) => e != null)
.cast<EventModel>()
.toList();
}
static EventModel? _parseToEvent(String data) {
try {
final cleandData = data.replaceAll('\n', '\r');
final String id = RegExp('UID:(.*?)\\r').firstMatch(cleandData)!.group(1)!;
final String summary =
RegExp('SUMMARY.*?:(.*?)\\r').firstMatch(cleandData)!.group(1)!;
final String dtStart =
RegExp('DTSTART.*:(.*?)\\r').firstMatch(cleandData)!.group(1)!;
final String dtEnd = RegExp('DTEND.*:(.*?)\\r').firstMatch(cleandData)!.group(1)!;
final description =
RegExp('DESCRIPTION:(.*?)\\r').firstMatch(cleandData)?.group(1);
var location =
RegExp('LOCATION:(.*?)\\r').firstMatch(cleandData)?.group(1)?.replaceAll('\\,', ',');
final attendees =
RegExp('ATTENDEE.*?CN=(.*?);', dotAll: true).allMatches(cleandData).map((e) => e.group(1)?.replaceAll('\r', '')
.replaceAll('\n', '')
.replaceAll(' ', '')).where((e) => e != null).cast<String>().toList();
final freq = RegExp('RRULE.*?FREQ=(.*?);', dotAll: true)
.firstMatch(cleandData)
?.group(1);
final interval = RegExp('RRULE.*?INTERVAL=(.*?);', dotAll: true)
.firstMatch(cleandData)
?.group(1);
final until = RegExp('RRULE.*?UNTIL=(.*?);', dotAll: true)
.firstMatch(cleandData)
?.group(1);
final List<EventOrganisationModel> eventOrganizer;
if(location!.contains('Brinkstraße')) {
location = 'Hiddingsel';
eventOrganizer = [EventOrganisationModel.fromId('garbage')!];
} else {
eventOrganizer = attendees.map((e) => fromAttendee(e)).where((e) => e != null).cast<EventOrganisationModel>().toList();
}
var freqKey = Frequency.once;
if (freq == 'DAILY') {
freqKey = Frequency.days;
} else if (freq == 'WEEKLY') {
freqKey = Frequency.weeks;
} else if (freq == 'MONTHLY') {
freqKey = Frequency.months;
}
return EventModel(id,
ScheduleModel(
_parse(dtStart),
_parse(dtEnd),
freqKey,
interval != null ? _parseInt(interval) : 1,
until != null ? _parse(until) : null
),
summary,
ContactModel(location: LocationModel(address: location)),
description: description,
eventOrganizer: eventOrganizer,
);
} catch (e) {
return null;
}
}
static DateTime _parse(String data) => DateTime.parse(data).toLocal();
static int _parseInt(String data) => int.parse(data);
static EventOrganisationModel? fromAttendee(String? attendee) {
if(attendee == null) return null;
switch (attendee) {
case 'sportverein@hiddingsel.de':
return EventOrganisationModel.fromId('svVorwaertsHiddingsel');
case 'dorfgemeinschaft@hiddingsel.de':
return EventOrganisationModel.fromId('dorfgemeinschaft');
case 'dorfnews@hiddingsel.de':
return EventOrganisationModel.fromId('dorfgemeinschaft');
case 'schuetzenverein-hiddingsel@hiddingsel.de':
return EventOrganisationModel.fromId('allgemeinerSchuetzenverein');
case 'kolping@hiddingsel.de':
return EventOrganisationModel.fromId('kolpingfamilieHiddingsel');
case 'landjugend@hiddingsel.de':
return EventOrganisationModel.fromId('landjugendHiddingsel');
case 'feuerwehr@hiddingsel.de':
return EventOrganisationModel.fromId('freiwilligeFeuerwehr');
case 'kirche@hiddingsel.de':
return EventOrganisationModel.fromId('stGeorgKirche');
case 'kindergarten@hiddingsel.de':
return EventOrganisationModel.fromId('kindergarten');
case 'grundschule@hiddingsel.de':
return EventOrganisationModel.fromId('grundschule');
case 'landfrauen@hiddingsel.de':
return EventOrganisationModel.fromId('landfrauen');
case 'schuetzenverein-daldrup@hiddingsel.de':
return EventOrganisationModel.fromId('daldruperSchuetzenverein');
case 'landwirtschaftlicher-ortsverein@hiddingsel.de':
return EventOrganisationModel.fromId('landwirtschaflicherOrtsverein');
case 'drk@hiddingsel.de':
return EventOrganisationModel.fromId('drk');
case 'eltern-kind-gruppe@hiddingsel.de':
return EventOrganisationModel.fromId('elternKindGruppe');
case 'kfd@hiddingsel.de':
return EventOrganisationModel.fromId('kfd');
case 'kulturforum@hiddingsel.de':
return EventOrganisationModel.fromId('kulturforum');
case 'psg@hiddingsel.de':
return EventOrganisationModel.fromId('pfadfinderinnenschaftStGeorg');
case 'seniorengemeinschaft@hiddingsel.de':
return EventOrganisationModel.fromId('seniorengemeinschaft');
case 'voices@hiddingsel.de':
return EventOrganisationModel.fromId('voices');
case 'aida@hiddingsel.de':
return EventOrganisationModel.fromId('aktivInDasAlter');
case 'foerderverein-kiga-schule@hiddingsel.de':
return EventOrganisationModel.fromId('foerdervereinKigaSchu');
case 'buecherei@hiddingsel.de':
return EventOrganisationModel.fromId('buecherei');
case 'jaegerzug@hiddingsel.de':
return EventOrganisationModel.fromId('jaegerzug');
case 'cdu@hiddingsel.de':
return EventOrganisationModel.fromId('cdu');
default:
return null;
}
}
}