/// <summary> /// Creates a new HtmlRichTextWriter instance. /// </summary> /// <param name="htmlWriter"> /// The text writer where the raw HTML is written to. /// The HtmlRichTextWriter does not take ownership of the htmlWriter; /// disposing the HtmlRichTextWriter will not dispose the underlying htmlWriter! /// </param> /// <param name="options">Options that control the HTML output.</param> public HtmlRichTextWriter(TextWriter htmlWriter, HtmlOptions options = null) { if (htmlWriter == null) throw new ArgumentNullException("htmlWriter"); this.htmlWriter = htmlWriter; this.options = options ?? new HtmlOptions(); }
/// <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. <c>null</c> is valid and will create HTML without any highlighting.</param> /// <param name="segment">The part of the document to create HTML for. You can pass <c>null</c> 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, IHighlighter highlighter, ISegment segment, HtmlOptions options) { if (document == null) throw new ArgumentNullException("document"); if (options == null) throw new ArgumentNullException("options"); if (highlighter != null && highlighter.Document != document) throw new ArgumentException("Highlighter does not belong to the specified document."); 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.LineNumber); else highlightedLine = new HighlightedLine(document, 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> /// Produces HTML code for a section of the line, with <span class="colorName"> tags. /// </summary> public string ToHtml(int startOffset, int endOffset, HtmlOptions options) { if (options == null) { throw new ArgumentNullException("options"); } int documentLineStartOffset = this.DocumentLine.Offset; int documentLineEndOffset = documentLineStartOffset + this.DocumentLine.Length; if (startOffset < documentLineStartOffset || startOffset > documentLineEndOffset) { throw new ArgumentOutOfRangeException("startOffset", startOffset, "Value must be between " + documentLineStartOffset + " and " + documentLineEndOffset); } if (endOffset < startOffset || endOffset > documentLineEndOffset) { throw new ArgumentOutOfRangeException("endOffset", endOffset, "Value must be between startOffset and " + documentLineEndOffset); } ISegment requestedSegment = new SimpleSegment(startOffset, endOffset - startOffset); List <HtmlElement> elements = new List <HtmlElement>(); for (int i = 0; i < this.Sections.Count; i++) { HighlightedSection s = this.Sections[i]; if (s.GetOverlap(requestedSegment).Length > 0) { elements.Add(new HtmlElement(s.Offset, i, false, s.Color)); elements.Add(new HtmlElement(s.Offset + s.Length, i, true, s.Color)); } } elements.Sort(); TextDocument document = this.Document; StringWriter w = new StringWriter(CultureInfo.InvariantCulture); int textOffset = startOffset; foreach (HtmlElement e in elements) { int newOffset = Math.Min(e.Offset, endOffset); if (newOffset > startOffset) { HtmlClipboard.EscapeHtml(w, document.GetText(textOffset, newOffset - textOffset), options); } textOffset = Math.Max(textOffset, newOffset); if (e.IsEnd) { w.Write("</span>"); } else { w.Write("<span"); options.WriteStyleAttributeForColor(w, e.Color); w.Write('>'); } } HtmlClipboard.EscapeHtml(w, document.GetText(textOffset, endOffset - textOffset), options); return(w.ToString()); }
/// <summary> /// Produces HTML code for a section of the line, with <span class="colorName"> tags. /// </summary> public string ToHtml(int startOffset, int endOffset, HtmlOptions options) { if (options == null) { throw new ArgumentNullException("options"); } int documentLineStartOffset = this.DocumentLine.Offset; int documentLineEndOffset = documentLineStartOffset + this.DocumentLine.Length; if (startOffset < documentLineStartOffset || startOffset > documentLineEndOffset) { throw new ArgumentOutOfRangeException("startOffset", startOffset, "Value must be between " + documentLineStartOffset + " and " + documentLineEndOffset); } if (endOffset < startOffset || endOffset > documentLineEndOffset) { throw new ArgumentOutOfRangeException("endOffset", endOffset, "Value must be between startOffset and " + documentLineEndOffset); } ISegment requestedSegment = new SimpleSegment(startOffset, endOffset - startOffset); List <HtmlElement> elements = new List <HtmlElement>(); for (int i = 0; i < this.Sections.Count; i++) { HighlightedSection s = this.Sections[i]; if (s.GetOverlap(requestedSegment).Length > 0) { elements.Add(new HtmlElement(s.Offset, i, false, s.Color)); elements.Add(new HtmlElement(s.Offset + s.Length, i, true, s.Color)); } } elements.Sort(); TextDocument document = DocumentLine.Document; StringBuilder b = new StringBuilder(); int textOffset = startOffset; foreach (HtmlElement e in elements) { int newOffset = Math.Min(e.Offset, endOffset); if (newOffset > startOffset) { HtmlClipboard.EscapeHtml(b, document.GetText(textOffset, newOffset - textOffset), options); } textOffset = newOffset; if (e.IsEnd) { b.Append("</span>"); } else { b.Append("<span style=\""); b.Append(e.Color.ToCss()); b.Append("\">"); } } HtmlClipboard.EscapeHtml(b, document.GetText(textOffset, endOffset - textOffset), options); return(b.ToString()); }
/// <summary> /// Produces HTML code for a section of the line, with <span style="..."> tags. /// </summary> public string ToHtml(int offset, int length, HtmlOptions options = null) { StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture); using (var htmlWriter = new HtmlRichTextWriter(stringWriter, options)) { htmlWriter.Write(this, offset, length); } return(stringWriter.ToString()); }
/// <summary> /// Produces HTML code for a section of the line, with <span class="colorName"> tags. /// </summary> public string ToHtml(int startOffset, int endOffset, HtmlOptions options = null) { StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture); using (var htmlWriter = new HtmlRichTextWriter(stringWriter, options)) { WriteTo(htmlWriter, startOffset, endOffset); } return(stringWriter.ToString()); }
/// <summary> /// Produces HTML code for the line, with <span class="colorName"> tags. /// </summary> public string ToHtml(HtmlOptions options = null) { StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture); using (var htmlWriter = new HtmlRichTextWriter(stringWriter, options)) { WriteTo(htmlWriter); } return(stringWriter.ToString()); }
/// <summary> /// Produces HTML code for the line, with <span class="colorName"> tags. /// </summary> public string ToHtml(HtmlOptions options) { int startOffset = this.DocumentLine.Offset; return(ToHtml(startOffset, startOffset + this.DocumentLine.Length, options)); }
/// <summary> /// Escapes text and writes the result to the StringBuilder. /// </summary> internal static void EscapeHtml(StringWriter w, string text, HtmlOptions options) { int spaceCount = -1; foreach (char c in text) { if (c == ' ') { if (spaceCount < 0) w.Write(" "); else spaceCount++; } else if (c == '\t') { if (spaceCount < 0) spaceCount = 0; spaceCount += options.TabSize; } else { if (spaceCount == 1) { w.Write(' '); } else if (spaceCount >= 1) { for (int i = 0; i < spaceCount; i++) { w.Write(" "); } } spaceCount = 0; switch (c) { case '<': w.Write("<"); break; case '>': w.Write(">"); break; case '&': w.Write("&"); break; case '"': w.Write("""); break; default: w.Write(c); break; } } } for (int i = 0; i < spaceCount; i++) { w.Write(" "); } }
/// <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. <c>null</c> is valid and will create HTML without any highlighting.</param> /// <param name="segment">The part of the document to create HTML for. You can pass <c>null</c> 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, IHighlighter highlighter, ISegment segment, HtmlOptions options) { if (document == null) { throw new ArgumentNullException("document"); } if (options == null) { throw new ArgumentNullException("options"); } if (highlighter != null && highlighter.Document != document) { throw new ArgumentException("Highlighter does not belong to the specified document."); } 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.LineNumber); } else { highlightedLine = new HighlightedLine(document, 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(StringWriter w, string text, HtmlOptions options) { int spaceCount = -1; foreach (char c in text) { if (c == ' ') { if (spaceCount < 0) { w.Write(" "); } else { spaceCount++; } } else if (c == '\t') { if (spaceCount < 0) { spaceCount = 0; } spaceCount += options.TabSize; } else { if (spaceCount == 1) { w.Write(' '); } else if (spaceCount >= 1) { for (int i = 0; i < spaceCount; i++) { w.Write(" "); } } spaceCount = 0; switch (c) { case '<': w.Write("<"); break; case '>': w.Write(">"); break; case '&': w.Write("&"); break; case '"': w.Write("""); break; default: w.Write(c); break; } } } for (int i = 0; i < spaceCount; i++) { w.Write(" "); } }
/// <summary> /// Creates a HTML fragment for the selected text. /// </summary> public string CreateHtmlFragment(TextArea textArea, HtmlOptions options) { if (textArea == null) throw new ArgumentNullException("textArea"); if (options == null) throw new ArgumentNullException("options"); IHighlighter highlighter = textArea.GetService(typeof(IHighlighter)) as IHighlighter; StringBuilder html = new StringBuilder(); bool first = true; foreach (ISegment selectedSegment in this.Segments) { if (first) first = false; else html.AppendLine("<br>"); html.Append(HtmlClipboard.CreateHtmlFragment(textArea.Document, highlighter, selectedSegment, options)); } return html.ToString(); }
/// <summary> /// Produces HTML code for a section of the line, with <span style="..."> tags. /// </summary> public string ToHtml(int offset, int length, HtmlOptions options = null) { StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture); using (var htmlWriter = new HtmlRichTextWriter(stringWriter, options)) { htmlWriter.Write(this, offset, length); } return stringWriter.ToString(); }