Example #1
0
        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);
                }
            }
        }
Example #2
0
        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);
        }