public override void ExecuteResult(ControllerContext context) { var calendar = new iCalendar(); calendar.AddProperty("X-WR-CALDESC", _name); calendar.AddProperty("X-WR-CALNAME", _name); foreach (var e in _events) { var calendarEvent = new DDay.iCal.Event { Description = e.Description, DTEnd = new iCalDateTime(e.DateEnd), DTStamp = new iCalDateTime(e.DateStart), DTStart = new iCalDateTime(e.DateStart), Location = e.Location, Summary = e.Summary, Url = new Uri(e.Url) }; calendar.Events.Add(calendarEvent); } var s = new iCalendarSerializer(); context.HttpContext.Response.ContentType = "text/calendar"; context.HttpContext.Response.Write(s.SerializeToString(calendar)); context.HttpContext.Response.End(); }
public static void TestDDayCalendarWriter() { Console.WriteLine("Serializing using DDayCalendarWriter"); DateTime startTime = DateTime.Now; using (var iCal = new iCalendar()) { iCal.AddLocalTimeZone(); iCal.AddProperty("X-WR-CALNAME", "CalendarName"); using (var stream = new StreamWriter("test2.ical")) { using (var writer = new DDayCalendarWriter(iCal, stream)) { for (int count = 0; count < 100000; count++) { var evnt = new Event {Summary = "Event " + count}; writer.Write(evnt); } } } } Console.WriteLine("Done: " + (DateTime.Now - startTime)); }
public static void TestDefaultSerialization() { Console.WriteLine("Serializing using default DDay serializer"); DateTime startTime = DateTime.Now; using (var iCal = new iCalendar()) { iCal.AddLocalTimeZone(); iCal.AddProperty("X-WR-CALNAME", "CalendarName"); using (var writer = new FileStream("test.ical", FileMode.OpenOrCreate)) { for (int count = 0; count < 100000; count++) { var evnt = new Event { Summary = "Event " + count }; iCal.Events.Add(evnt); } var serializer = new iCalendarSerializer(); serializer.Serialize(iCal, writer, Encoding.UTF8); } } Console.WriteLine("Done: " + (DateTime.Now - startTime)); }
public static void Main(string[] args) { // Название нашей таблицы с расписанием. string filePath = @"test2.xlsx"; // Парсим xlsx-таблицу List<WorkDay> week = ParseExcelSchedule.Parse(filePath); // Задаем дату начала семестра. iCalDateTime startStudy = new iCalDateTime(2015, 9, 1); // Создаём календарь, в который будем сохранять матчи. iCalendar CalForSchedule = new iCalendar { Method = "PUBLISH", Version = "2.0", }; // Эти настройки нужны для календаря Mac, чтобы он был неотличим от // оригинального календаря (т.е. созданного внутри Mac Calendar) CalForSchedule.AddProperty("CALSCALE", "GREGORIAN"); CalForSchedule.AddProperty("X-WR-CALNAME", "Расписание"); CalForSchedule.AddProperty("X-WR-TIMEZONE", "Europe/Moscow"); CalForSchedule.AddLocalTimeZone(); // Сохраняем дату начала первой учебной недели. //TODO тут какое-то говно с преобразованием iCalDateTime в IDateTime int numberOfFirstDayOfFirstStudyWeek = startStudy.DayOfYear - ParseExcelSchedule.GetIntNumberFromDayWeek(startStudy.DayOfWeek.ToString()); iCalDateTime firstDayOfFirstStudyWeek = new iCalDateTime(startStudy.FirstDayOfYear.AddDays(numberOfFirstDayOfFirstStudyWeek)); // Пробегаемся по всем учебным дням в неделе. foreach (WorkDay workDay in week) { // Информация для отладки. Console.WriteLine(workDay); // Плюсуем к понедельнику первой учебной недели номер нашего обрабатываемого дня iCalDateTime tmpDate = new iCalDateTime(firstDayOfFirstStudyWeek.AddDays(workDay.dayNumber - 1)); // В каждом занятии пробегаемся по неделям, когда оно повторяется. foreach (int number in workDay.repeatAt) { // Плюсуем к временной дате (номер недели - 1, т.к. чтобы перейти // к первой неделе не нужно плюсовать неделю) * 7 дней) и // приводим к локальной временной зоне. iCalDateTime StartClass = new iCalDateTime(tmpDate.AddDays((number - 1) * 7).Local); // Если неделя первая (подразумевается, что она не полная) // и день занятий раньше для начала учебы, тогда не записываем его. if ((number == 1 && StartClass.LessThan(startStudy)) || (StartClass.GreaterThanOrEqual(new iCalDateTime(startStudy.FirstDayOfYear.AddDays(363))) && !(isLeapYear(StartClass.Year))) || (StartClass.GreaterThanOrEqual(new iCalDateTime(startStudy.FirstDayOfYear.AddDays(364))) && isLeapYear(StartClass.Year))) continue; Event newClass = CalForSchedule.Create<Event>(); newClass.DTStart = StartClass; newClass.DTStart = newClass.DTStart.Add(workDay.timeClassStart); newClass.Duration = workDay.timeClassEnd - workDay.timeClassStart; newClass.Summary = string.Format("{0}", workDay.nameSubject); newClass.Description = string.Format("Преподаватель: {0}", workDay.nameLecturer); newClass.Location = string.Format("{0}, {1}", workDay.typeClass, workDay.place); newClass.IsAllDay = false; // Добавим напоминание к парам, чтобы не забыть о них. Alarm alarm = new Alarm(); alarm.Trigger = new Trigger(TimeSpan.FromMinutes(-5)); alarm.Description = "Напоминание о событии"; alarm.AddProperty("ACTION", "DISPLAY"); newClass.Alarms.Add(alarm); // Если это первая пара за день, напоминаем о ней за 2,5 часа. if (workDay.isFirstClassesOfADay) { Alarm alarm2 = new Alarm(); alarm2.Trigger = new Trigger(TimeSpan.FromMinutes(-150)); alarm2.Description = "Напоминание о событии"; alarm2.AddProperty("ACTION", "DISPLAY"); newClass.Alarms.Add(alarm2); } } } // Сериализуем наш календарь. iCalendarSerializer serializer = new iCalendarSerializer(); serializer.Serialize(CalForSchedule, "Расписание.ics"); Console.WriteLine("Календарь расписания сохранён успешно" + Environment.NewLine); }
public static void Main(string[] args) { // Адрес сайта, откуда будем парсить данные. string WebAddress = @"http://www.sports.ru/barcelona/calendar/"; // Создаём экземляры классов веб-страницы и веб-документа HtmlWeb WebGet = new HtmlWeb(); // Загружаем html-документ с указанного сайта. HtmlDocument htmlDoc = WebGet.Load(WebAddress); // Сюда будем сохранять матчи Matches MatchesFC = new Matches(); // Парсим название клуба (удаляя символ возрата каретки) MatchesFC.NameFC = htmlDoc.DocumentNode. SelectSingleNode(".//*[@class='titleH1']"). FirstChild.InnerText.Replace("\r\n", ""); // Находим в этом документе таблицу с датами матчей с помощью XPath-выражений. HtmlNode Table = htmlDoc.DocumentNode.SelectSingleNode(".//*[@class='stat-table']/tbody"); // Из полученной таблицы выделяем все элементы-строки с тегом "tr". IEnumerable<HtmlNode> rows = Table.Descendants().Where(x => x.Name == "tr"); foreach (var row in rows) { // Создаём коллекцию из ячеек каждой строки. HtmlNodeCollection cells = row.ChildNodes; // Создаём экземпляр класса SingleMatch, чтобы затем добавить его в лист. SingleMatch match = new SingleMatch(); // Парсим дату, предварительно убирая из строки символ черточки "|", // иначе наш метод TryParse не сможет правильно обработать. DateTime time; DateTime.TryParse(cells[1].InnerText.Replace("|", " "), out time); match.StartTime = time; // Остальные поля просто заполняем, зная нужный нам индекс. match.Tournament = cells[3].InnerText; // В ячейке "Соперник" нужно удалить символ неразрывного пробела (" ") match.Rival = cells[5].InnerText.Replace(" ", ""); match.Place = cells[6].InnerText; // Добавляем одиночный матч в лист матчей. MatchesFC.ListMatches.Add(match); } // Создаём календарь, в который будем сохранять матчи. iCalendar CalForMatches = new iCalendar { Method = "PUBLISH", Version = "2.0" }; // Эти настройки нужны для календаря Mac, чтобы он был неотличим от // оригинального календаря (т.е. созданного внутри Mac Calendar) CalForMatches.AddProperty("CALSCALE", "GREGORIAN"); CalForMatches.AddProperty("X-WR-CALNAME", "Mатчи ФК " + MatchesFC.NameFC); CalForMatches.AddProperty("X-WR-TIMEZONE", "Europe/Moscow"); CalForMatches.AddLocalTimeZone(); // Сохраняем полученный результат. foreach (SingleMatch match in MatchesFC.ListMatches) { Event newMatch = CalForMatches.Create<Event>(); newMatch.DTStart = new iCalDateTime(match.StartTime); newMatch.Duration = new TimeSpan(2, 30, 0); newMatch.Summary = string.Format("{0} : {1}", MatchesFC.NameFC, match.Rival); newMatch.Description = string.Format("{0}. {1} : {2}, {3}", match.Tournament, MatchesFC.NameFC, match.Rival, match.Place); // Добавим напоминание к матчам, чтобы не забыть о них Alarm alarm = new Alarm(); alarm.Trigger = new Trigger(TimeSpan.FromMinutes(-10)); alarm.Description = "Напоминание о событии"; alarm.AddProperty("ACTION", "DISPLAY"); newMatch.Alarms.Add(alarm); } // Сериализуем наш календарь. iCalendarSerializer serializer = new iCalendarSerializer(); serializer.Serialize(CalForMatches, MatchesFC.NameFC + ".ics"); Console.WriteLine("Календарь матчей сохранён успешно" + Environment.NewLine); return; }