public override async Task Execute(params object[] args) { using (var one = new OneNote(out var page, out var ns)) { var tags = page.Root.Elements(ns + "Outline").Descendants(ns + "Tag").ToList(); if (!tags.Any()) { return; } var updated = false; var reminders = new ReminderSerializer().LoadReminders(page); var tagdefs = page.GetTagDefMap().Select(m => m.TagDef); foreach (var tag in tags) { // lookup the tagdef to cross-reference symbol var tagdef = tagdefs .FirstOrDefault(m => m.Index == tag.Attribute("index").Value); if (tagdef != null) { var objectId = tag.Parent.Attribute("objectID").Value; // ensure tag is not a reminder for its paragraph if (!reminders.Any(r => r.Symbol == tagdef.Symbol && r.ObjectId == objectId)) { tag.Remove(); updated = true; } } } if (updated) { await one.Update(page); } } }
private Reminder GetReminder(XElement paragraph) { Reminder reminder; XElement tag; var objectID = paragraph.Attribute("objectID").Value; var reminders = new ReminderSerializer().LoadReminders(page); if (reminders.Any()) { reminder = reminders.FirstOrDefault(r => r.ObjectId == objectID); if (reminder != null && !string.IsNullOrEmpty(reminder.Symbol) && reminder.Symbol != "0") { // check tag still exists var index = page.GetTagDefIndex(reminder.Symbol); if (index != null) { tag = paragraph.Elements(ns + "Tag") .FirstOrDefault(e => e.Attribute("index").Value == index); if (tag != null) { // synchronize reminder with tag if (tag.Attribute("completed").Value == "true" && reminder.Status != ReminderStatus.Completed) { reminder.Status = ReminderStatus.Completed; reminder.Percent = 100; reminder.Completed = DateTime.Parse(tag.Attribute("completionDate").Value); } return(reminder); } } } } // either no meta or meta is orphaned from its tag so create a new one... var text = paragraph.Value; // get only raw text without <span> et al. This direct pattern match feels risky but // it seems to work for Unicode strings like Chinese whereas XElement.Parse will fail text = Regex.Replace(text, "<[^>]+>", string.Empty); if (text.Length > 40) { text = text.Substring(0, 40) + "..."; } reminder = new Reminder(objectID) { Subject = text }; tag = paragraph.Elements(ns + "Tag").FirstOrDefault(); if (tag != null) { // use existing tag on paragraph, synchronize reminder with this tag reminder.TagIndex = tag.Attribute("index").Value; reminder.Symbol = page.GetTagDefSymbol(reminder.TagIndex); reminder.Created = DateTime.Parse(tag.Attribute("creationDate").Value); var completionDate = tag.Attribute("creationDate"); if (completionDate != null) { reminder.Completed = DateTime.Parse(completionDate.Value); } } else { // use default symbol // if dialog is cancelled, OneNote will clean up the unused TagDef reminder.TagIndex = page.AddTagDef(reminder.Symbol, string.Format(Resx.RemindCommand_nameFormat, reminder.Due.ToFriendlyString())); } return(reminder); }