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); }
private bool StylizeWords() { // find all selected T element; may be multiple if text is selected across // multiple paragraphs - OEs - but partial paragraphs may be selected too... var selections = page.Descendants(ns + "T") .Where(e => e.Attributes("selected").Any(a => a.Value.Equals("all"))); if (selections == null) { // shouldn't happen, but... return(false); } foreach (var selection in selections) { bool empty = true; if (selection.Parent.Nodes().Count() == 1) { // OE parent must have only this T stylizer.ApplyStyle(selection); } else { // OE parent has multiple Ts so test if we need to merge them //logger.WriteLine("selection.parent:" + (selection.Parent as XElement).ToString(SaveOptions.None)); var cdata = selection.GetCData(); // text cursor is positioned but selection length is 0 if (cdata.IsEmpty()) { // inside a word, adjacent to a word, or somewhere in whitespace? var prev = selection.PreviousNode as XElement; if ((prev != null) && prev.GetCData().EndsWithWhitespace()) { prev = null; } var next = selection.NextNode as XElement; if ((next != null) && next.GetCData().StartsWithWhitespace()) { next = null; } if ((prev != null) && (next != null)) { empty = false; // navigate to closest word var word = new StringBuilder(); if (prev != null) { logger.WriteLine("prev:" + prev.ToString(SaveOptions.None)); if (!prev.GetCData().EndsWithWhitespace()) { // grab previous part of word word.Append(prev.ExtractLastWord()); //logger.WriteLine("word with prev:" + word.ToString()); //logger.WriteLine("prev updated:" + prev.ToString(SaveOptions.None)); //logger.WriteLine("parent:" + (selection.Parent as XElement).ToString(SaveOptions.None)); if (prev.GetCData().Value.Length == 0) { prev.Remove(); } } } if (next != null) { logger.WriteLine("next:" + next.ToString(SaveOptions.None)); if (!next.GetCData().StartsWithWhitespace()) { // grab following part of word word.Append(next.ExtractFirstWord()); //logger.WriteLine("word with next:" + word.ToString()); //logger.WriteLine("next updated:" + next.ToString(SaveOptions.None)); //logger.WriteLine("parent:" + (selection.Parent as XElement).ToString(SaveOptions.None)); if (next.GetCData().Value.Length == 0) { next.Remove(); } } } if (word.Length > 0) { selection.DescendantNodes().OfType <XCData>() .First() .ReplaceWith(new XCData(word.ToString())); //logger.WriteLine("parent udpated:" + (selection.Parent as XElement).ToString(SaveOptions.None)); } else { empty = true; } //logger.WriteLine("parent:" + (selection.Parent as XElement).ToString(SaveOptions.None)); } } if (empty) { stylizer.ApplyStyle(selection.GetCData()); //logger.WriteLine("final empty parent:" + (selection.Parent as XElement).ToString(SaveOptions.None)); } else { stylizer.ApplyStyle(selection); //logger.WriteLine("final parent:" + (selection.Parent as XElement).ToString(SaveOptions.None)); } } } return(true); }