static XElement CreateHTML(int jaar, Omrin.AansluitingValidatie aansluiting, Omrin.KalenderObject kalender, string icalFilename) { var x = (XNamespace)"http://www.w3.org/1999/xhtml"; return(new XElement(x + "html", new XElement(x + "head", new XElement(x + "title", $"Afvalkalender {jaar}"), new XElement(x + "meta", new XAttribute("name", "viewport"), new XAttribute("content", "width=device-width, initial-scale=1")), new XElement(x + "style", ".flex { display:flex; flex-wrap:wrap; }", ".flex>div { max-width: 20em; margin-right:5px; }" )), new XElement(x + "body", new XElement(x + "h1", $"Afvalkalender {jaar}"), new XElement(x + "p", $"{aansluiting.Straat} {aansluiting.Huistnummer}{aansluiting.Toevoeging}, {aansluiting.Postcode} {aansluiting.Woonplaats}"), new XElement(x + "p", "Link naar iCal bestand om toe te voegen in Google/Outlook/iCloud/Android: ", new XElement(x + "a", new XAttribute("href", icalFilename), icalFilename)), new XElement(x + "div", new XAttribute("class", "flex"), kalender.Groepen.Select(CreateHTMLCalendar))))); }
static IEnumerable <string> CreateICS(int jaar, Omrin.AansluitingValidatie aansluiting, Omrin.KalenderObject kalender) { /* BEGIN:VEVENT * DTSTART:20150207T210500Z * DTEND:20150207T211000Z * DTSTAMP:20150204T133100Z * UID:[email protected] * CREATED:20150129T204608Z * DESCRIPTION:Test event 2 description * LOCATION:Zaailand 16\, Leeuwarden * SEQUENCE:1 * SUMMARY:Test event 2 * END:VEVENT */ var sequence = 0; var adres = $"{aansluiting.Straat} {aansluiting.Huistnummer}{aansluiting.Toevoeging}, {aansluiting.Woonplaats}".iCalendarEscape(); var utcnow = $"{DateTime.UtcNow.ToISOString()}Z"; yield return($"BEGIN:VCALENDAR"); yield return($"VERSION:2.0"); yield return($"X-WR-CALNAME:Afvalkalender {jaar}"); yield return($"X-WR-CALDESC:{adres}"); yield return($"CALSCALE:GREGORIAN"); foreach (var groep in kalender.Groepen) { var datums = groep.Datums ?? Enumerable.Empty <Omrin.KalenderGroepDatum>(); // XXX: i used to sort events by date, does it really matter? foreach (var datum in datums) { // XXX: these codes lead to churn ... better to detect times in description field? var time = groep.Afbeelding == "SOR" ? datum.Datum.SetTime(7, 30, 0, 0) : groep.Afbeelding == "BIO" ? datum.Datum.SetTime(7, 30, 0, 0) : groep.Afbeelding == "EGF" ? datum.Datum.SetTime(7, 30, 0, 0) : groep.Afbeelding == "PAP" ? datum.Datum.SetTime(17, 30, 0, 0) : datum.Datum; yield return($"BEGIN:VEVENT"); yield return($"SEQUENCE:{++sequence}"); yield return($"UID:{aansluiting.AansluitingID}-{jaar}-{sequence}@stomrin.nl"); yield return($"DTSTART;TZID=Europe/Amsterdam:{time.ToISOString()}"); yield return($"DTEND;TZID=Europe/Amsterdam:{time.AddHours(1).ToISOString()}"); yield return($"DTSTAMP:{utcnow}"); yield return($"SUMMARY:{groep.Omschrijvging.iCalendarEscape()}"); yield return($"DESCRIPTION:{groep.Info.Replace("\r", "").Replace("\n", "").iCalendarEscape()}"); yield return($"END:VEVENT"); } } yield return($"END:VCALENDAR"); }