/// <summary> /// Creates a new instance of BaseHighlighter /// </summary> /// <param name="document">Document to highlight</param> public BaseHighlighter(ITextDocument document) { this.document = document; // Much faster to keep a worker range rather than to keep requesting one from // the document this.workerRange = document.GetRange(0, 0); this._highlights = new List<Tuple<Regex, Action<ITextCharacterFormat>>>(); // Add highlighting rules AddHighlightRules(); }
private static void ForEachLinkInDocument(ITextDocument document, Action <ITextRange> action) { var range = document.GetRange(0, 0); range.SetIndex(TextRangeUnit.Character, -1, false); // Handle link at the very end of the document where GetIndex fails to detect range.Expand(TextRangeUnit.Link); if (!string.IsNullOrEmpty(range.Link)) { action?.Invoke(range); } var nextIndex = range.GetIndex(TextRangeUnit.Link); while (nextIndex != 0 && nextIndex != 1) { range.Move(TextRangeUnit.Link, -1); var linkRange = range.GetClone(); linkRange.Expand(TextRangeUnit.Link); // Adjacent links have the same index. Manually check each link with Collapse and Expand. var previousStart = linkRange.StartPosition; var hasAdjacentToken = true; while (hasAdjacentToken) { action?.Invoke(linkRange); linkRange.Collapse(false); linkRange.Expand(TextRangeUnit.Link); hasAdjacentToken = !string.IsNullOrEmpty(linkRange.Link) && linkRange.StartPosition != previousStart; previousStart = linkRange.StartPosition; } nextIndex = range.GetIndex(TextRangeUnit.Link); } }
public static void ToHtml(ITextDocument doc) { // Takes a RichEditBox control and returns a // simple HTML-formatted version of its contents string strHTML, strFont, strColour, strBold, strFntName; float shtSize; int lngOriginalStart, lngOriginalLength; int intCount = 0; ITextRange tr = doc.GetRange(0, 9999999); // If nothing in the box, exit if (tr.Length == 0) { //App.Current.Exit(); } // Store original selections, then select first character lngOriginalStart = 0; lngOriginalLength = tr.Length; tr.SetRange(0, 1); // Add HTML header strHTML = "<html>"; // Set up initial parameters strColour = tr.CharacterFormat.ForegroundColor.ToString(); strFont = tr.CharacterFormat.FontStyle.ToString(); shtSize = tr.CharacterFormat.Size; strBold = tr.CharacterFormat.Bold.ToString(); strFntName = tr.CharacterFormat.Name; Debug.WriteLine("Colour: " + strColour); // Include first 'style' parameters in the HTML strHTML += "<span style=\"font-family:" + strFntName + "; font-size: " + shtSize + "pt; color: #" + strColour.Substring(3) + "\">"; // Include bold tag, if required if (strBold.ToLower() == "on") { strHTML += "<b>"; } // Include italic tag, if required if (strFont.ToLower() == "italic") { strHTML += "<i>"; } // Finally, add our first character strHTML += tr.Character; // Loop around all remaining characters for (intCount = 2; intCount < lngOriginalLength; intCount++) { // Select current character tr.SetRange(intCount - 1, intCount + 1); // If this is a line break, add HTML tag if (tr.Character == Convert.ToChar(13)) { strHTML += "<br />"; } // ' Check/implement any changes in style if (tr.CharacterFormat.ForegroundColor.ToString() != strColour || tr.CharacterFormat.Name != strFntName || tr.CharacterFormat.Size != shtSize) { strHTML += "</span><span style=\"font-family: " + tr.CharacterFormat.Name + "; font size: " + tr.CharacterFormat.Size + "pt; color: #" + tr.CharacterFormat.ForegroundColor.ToString().Substring(3) + "\">"; } // Check for bold changes if (tr.CharacterFormat.Bold.ToString().ToLower() != strBold.ToLower()) { if (tr.CharacterFormat.Bold.ToString().ToLower() != "on") { strHTML += "</b>"; } else { strHTML += "<b>"; } } // Check for italic changes if (tr.CharacterFormat.FontStyle.ToString().ToLower() != strFont.ToLower()) { if (tr.CharacterFormat.FontStyle.ToString().ToLower() != "italic") { strHTML += "</i>"; } else { strHTML += "<i>"; } } // ' Add the actual character strHTML += tr.Character; // ' Update variables with current style strColour = tr.CharacterFormat.ForegroundColor.ToString(); strFont = tr.CharacterFormat.FontStyle.ToString(); shtSize = tr.CharacterFormat.Size; strFntName = tr.CharacterFormat.Name; strBold = tr.CharacterFormat.Bold.ToString(); } // Close off any open bold/italic tags if (strBold == "on") { strHTML += ""; } if (strFont.ToLower() == "italic") { strHTML += ""; } // Terminate outstanding HTML tags strHTML += "</span></html>"; //' Restore original RichTextBox selection tr.SetRange(lngOriginalStart, lngOriginalLength); doc.SetText(TextSetOptions.FormatRtf, strHTML); }
public static void SetRangeColor(this ITextDocument document, int start, int end, Color color) { ITextRange range = document.GetRange(start, end); range.CharacterFormat.ForegroundColor = color; }
public static ITextRange GetRangeAt(this ITextDocument document, int position) { return(document.GetRange(position, position)); }