Exemplo n.º 1
0
        private Style FindCustomStyle(XElement block)
        {
            var child = block.Descendants(ns + "T").FirstOrDefault();

            if (child != null)
            {
                var analyzer = new StyleAnalyzer(page);
                var style    = new Style(analyzer.CollectStyleProperties(child));

                var find = customStyles.Find(s =>
                                             s.FontFamily == style.FontFamily &&
                                             s.FontSize == style.FontSize &&
                                             s.Color == style.Color &&
                                             s.Highlight == style.Highlight &&
                                             s.IsBold == style.IsBold &&
                                             s.IsItalic == style.IsItalic &&
                                             s.IsUnderline == style.IsUnderline &&
                                             s.SpaceBefore == style.SpaceBefore &&
                                             s.SpaceAfter == style.SpaceAfter
                                             // ignoring IsStrikethrough, IsSuperscript, IsSubscript
                                             );

                return(find);
            }

            return(null);
        }
Exemplo n.º 2
0
        private int AlterSelections()
        {
            var elements = page.Root.Element(ns + "Outline").Descendants(ns + "T")
                           .Where(e => e.Attributes("selected").Any(a => a.Value == "all"));

            if (elements.IsNullOrEmpty())
            {
                return(0);
            }

            var count    = 0;
            var analyzer = new StyleAnalyzer(page.Root, true);

            foreach (var element in elements)
            {
                analyzer.Clear();
                var style = new Style(analyzer.CollectStyleProperties(element));

                // add .05 to compensate for unpredictable behavior; there are cases where going
                // from 11pt to 12pt actually causes OneNote to calculate 9pt :-(
                style.FontSize = (ParseFontSize(style.FontSize) + delta).ToString("#0") + ".05pt";

                var stylizer = new Stylizer(style);
                stylizer.ApplyStyle(element);
                count++;
            }

            return(count);
        }
Exemplo n.º 3
0
        /*
         * <one:OE >
         * <one:T><![CDATA[<span
         * style='font-family:Calibri'>This is the third </span><span style='font-weight:
         * bold;font-style:italic;text-decoration:underline line-through;font-family:Consolas;
         * color:#70AD47'>li</span>]]></one:T>
         * <one:T selected="all" style="font-family:Consolas;font-size:12.0pt;color:#70AD47"><![CDATA[]]></one:T>
         * <one:T style="font-family:Consolas;font-size:12.0pt;color:#70AD47"><![CDATA[<span style='font-weight:bold;font-style:italic;
         * text-decoration:underline line-through'>ne </span>]]></one:T>
         * </one:OE>
         */

        /// <summary>
        /// Infer styles from the context at the position of the text cursor on the current page.
        /// </summary>
        private Style CollectStyleFromContext()
        {
            // infer contextual style

            XElement page = null;

            using (var manager = new ApplicationManager())
            {
                page = manager.CurrentPage();
            }

            if (page == null)
            {
                return(null);
            }

            var ns = page.GetNamespaceOfPrefix("one");

            var selection =
                (from e in page.Descendants(ns + "T")
                 where e.Attributes("selected").Any(a => a.Value.Equals("all"))
                 select e).FirstOrDefault();

            if (selection != null)
            {
                var analyzer = new StyleAnalyzer(page, inward: false);

                var cdata = selection.GetCData();
                if (cdata.IsEmpty())
                {
                    // inside a word, adjacent to a word, or somewhere in whitespace?

                    if ((selection.PreviousNode is XElement prev) && !prev.GetCData().EndsWithWhitespace())
                    {
                        selection = prev;

                        if ((selection.DescendantNodes()?
                             .OfType <XCData>()
                             .LastOrDefault() is XCData data) && !string.IsNullOrEmpty(data?.Value))
                        {
                            var wrapper = data.GetWrapper();

                            // if last node is text then skip the cdata and examine the parent T
                            // otherwise if last node is a span then start with its style

                            var last = wrapper.Nodes().Reverse().First(n =>
                                                                       n.NodeType == XmlNodeType.Text ||
                                                                       ((n is XElement ne) && ne.Name.LocalName == "span"));

                            if (last?.NodeType == XmlNodeType.Element)
                            {
                                var wspan = last as XElement;
                                if (wspan.Attribute("style") != null)
                                {
                                    analyzer.CollectStyleProperties(wspan);
                                }
                            }
                        }
                    }
                    else
                    {
                        if ((selection.NextNode is XElement next) && !next.GetCData().StartsWithWhitespace())
                        {
                            selection = next;

                            if ((selection.DescendantNodes()?
                                 .OfType <XCData>()
                                 .FirstOrDefault() is XCData data) && !string.IsNullOrEmpty(data?.Value))
                            {
                                var wrapper = data.GetWrapper();

                                // if first node is text then skip the cdata and examine the parent T
                                // otherwise if first node is a span then start with its style

                                var last = wrapper.Nodes().First(n =>
                                                                 n.NodeType == XmlNodeType.Text ||
                                                                 ((n is XElement ne) && ne.Name.LocalName == "span"));

                                if (last?.NodeType == XmlNodeType.Element)
                                {
                                    var wspan = last as XElement;
                                    if (wspan.Attribute("style") != null)
                                    {
                                        analyzer.CollectStyleProperties(wspan);
                                    }
                                }
                            }
                        }
                    }
                }

                var properties = analyzer.CollectStyleProperties(selection);

                var style = new Style(properties)
                {
                    Name = "Style-" + new Random().Next(1000, 9999).ToString()
                };

                return(style);
            }