/// <summary> /// Creates a HTML fragment for the selected part of the document. /// </summary> public static string CreateHtmlFragmentForSelection(TextArea textArea, HtmlOptions options) { if (textArea == null) { throw new ArgumentNullException("textArea"); } if (options == null) { throw new ArgumentNullException("options"); } DocumentHighlighter highlighter = textArea.GetService(typeof(DocumentHighlighter)) as DocumentHighlighter; StringBuilder html = new StringBuilder(); foreach (ISegment selectedSegment in textArea.Selection.Segments) { html.AppendLine(CreateHtmlFragment(textArea.Document, highlighter, selectedSegment, options)); } return(html.ToString()); }
/// <summary> /// Creates a HTML fragment from a part of a document. /// </summary> /// <param name="document">The document to create HTML from.</param> /// <param name="highlighter">The highlighter used to highlight the document.</param> /// <param name="segment">The part of the document to create HTML for. You can pass null to create HTML for the whole document.</param> /// <param name="options">The options for the HTML creation.</param> /// <returns>HTML code for the document part.</returns> public static string CreateHtmlFragment(TextDocument document, DocumentHighlighter highlighter, ISegment segment, HtmlOptions options) { if (document == null) { throw new ArgumentNullException("document"); } if (options == null) { throw new ArgumentNullException("options"); } if (segment == null) { segment = new SimpleSegment(0, document.TextLength); } StringBuilder html = new StringBuilder(); int segmentEndOffset = segment.EndOffset; DocumentLine line = document.GetLineByOffset(segment.Offset); while (line != null && line.Offset < segmentEndOffset) { HighlightedLine highlightedLine; if (highlighter != null) { highlightedLine = highlighter.HighlightLine(line); } else { highlightedLine = new HighlightedLine(line); } SimpleSegment s = segment.GetOverlap(line); if (html.Length > 0) { html.AppendLine("<br>"); } html.Append(highlightedLine.ToHtml(s.Offset, s.EndOffset, options)); line = line.NextLine; } return(html.ToString()); }
/// <summary> /// Escapes text and writes the result to the StringBuilder. /// </summary> internal static void EscapeHtml(StringBuilder b, string text, HtmlOptions options) { int spaceCount = -1; foreach (char c in text) { if (c == ' ') { if (spaceCount < 0) { b.Append(" "); } else { spaceCount++; } } else if (c == '\t') { if (spaceCount < 0) { spaceCount = 0; } spaceCount += options.TabSize; } else { if (spaceCount == 1) { b.Append(' '); } else if (spaceCount >= 1) { for (int i = 0; i < spaceCount; i++) { b.Append(" "); } } spaceCount = 0; switch (c) { case '<': b.Append("<"); break; case '>': b.Append(">"); break; case '&': b.Append("&"); break; case '"': b.Append("""); break; default: b.Append(c); break; } } } for (int i = 0; i < spaceCount; i++) { b.Append(" "); } }