/*
         * Find consecutive empty lines that need to be collapsed...
         */

        public bool CollapseEmptyLines(Page page, XNamespace ns)
        {
            var elements =
                (from e in page.Root.Descendants(ns + "OE")
                 let t = e.Elements().FirstOrDefault()
                         where (t?.Name.LocalName == "T") && (t.TextValue().Trim().Length == 0)
                         select e)
                .ToList();

            if (elements?.Any() != true)
            {
                return(false);
            }

            var modified = false;

            var quickStyles = page.GetQuickStyles()
                              .Where(s => s.StyleType == StyleType.Heading);

            var customStyles = new ThemeProvider().Theme.GetStyles()
                               .Where(e => e.StyleType == StyleType.Heading)
                               .ToList();

            foreach (var element in elements)
            {
                // is this a known Heading style?
                var attr = element.Attribute("quickStyleIndex");
                if (attr != null)
                {
                    var index = int.Parse(attr.Value, CultureInfo.InvariantCulture);
                    if (quickStyles.Any(s => s.Index == index))
                    {
                        // remove empty standard heading
                        element.Remove();
                        modified = true;
                        continue;
                    }
                }

                // is this a custom Heading style?
                var style = new Style(element.CollectStyleProperties(true));
                if (customStyles.Any(s => s.Equals(style)))
                {
                    // remove empty custom heading
                    element.Remove();
                    modified = true;
                    continue;
                }

                // is this an empty paragraph preceded by an empty paragraph?
                if (element.PreviousNode != null &&
                    element.PreviousNode.NodeType == System.Xml.XmlNodeType.Element)
                {
                    var prev = element.PreviousNode as XElement;

                    if (prev.Name.LocalName == "OE")
                    {
                        var t = prev.Elements().Last();
                        if (t.Name.LocalName == "T" && t.TextValue().Trim().Length == 0)
                        {
                            // remove consecutive empty line
                            prev.Remove();
                            modified = true;
                        }
                    }
                }
            }

            return(modified);
        }
        private async Task RemoveSpacing()
        {
            using (var one = new OneNote(out var page, out var ns))
            {
                logger.StartClock();

                var elements = page.Root.Descendants(page.Namespace + "OE")
                               .Where(e =>
                                      e.Attribute("spaceBefore") != null ||
                                      e.Attribute("spaceAfter") != null ||
                                      e.Attribute("spaceBetween") != null)
                               .ToList();

                page.GetTextCursor();
                if (page.SelectionScope != SelectionScope.Empty)
                {
                    elements = elements.Where(e => e.Attribute("selected") != null).ToList();
                }

                if (elements.Count == 0)
                {
                    logger.StopClock();
                    return;
                }

                var quickStyles = page.GetQuickStyles()
                                  .Where(s => s.StyleType == StyleType.Heading);

                var customStyles = new ThemeProvider().Theme.GetStyles()
                                   .Where(e => e.StyleType == StyleType.Heading)
                                   .ToList();

                var modified = false;

                foreach (var element in elements)
                {
                    // is this a known Heading style?
                    var attr = element.Attribute("quickStyleIndex");
                    if (attr != null)
                    {
                        var index = int.Parse(attr.Value, CultureInfo.InvariantCulture);
                        if (quickStyles.Any(s => s.Index == index))
                        {
                            if (includeHeadings)
                            {
                                modified |= CleanElement(element);
                            }

                            continue;
                        }
                    }

                    // is this a custom Heading style?
                    var style = new Style(element.CollectStyleProperties(true));
                    if (customStyles.Any(s => s.Equals(style)))
                    {
                        if (includeHeadings)
                        {
                            modified |= CleanElement(element);
                        }

                        continue;
                    }

                    // normal paragraph
                    modified |= CleanElement(element);
                }

                logger.WriteTime("removed spacing, now saving...");

                if (modified)
                {
                    await one.Update(page);
                }
            }
        }