예제 #1
0
        /// <summary>
        /// Produces HTML code for a section of the line, with &lt;span class="colorName"&gt; 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 (SimpleSegment.GetOverlap(s, 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();

            IDocument    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 (options.ColorNeedsSpanForStyling(e.Color))
                {
                    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());
        }
예제 #2
0
        /// <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(IDocument 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;
            IDocumentLine 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 = SimpleSegment.GetOverlap(segment, line);
                if (html.Length > 0)
                {
                    html.AppendLine("<br>");
                }
                html.Append(highlightedLine.ToHtml(s.Offset, s.EndOffset, options));
                line = line.NextLine;
            }
            return(html.ToString());
        }
예제 #3
0
        /// <summary>
        /// Produces HTML code for the line, with &lt;span class="colorName"&gt; tags.
        /// </summary>
        public string ToHtml(HtmlOptions options)
        {
            int startOffset = this.DocumentLine.Offset;

            return(ToHtml(startOffset, startOffset + this.DocumentLine.Length, options));
        }
예제 #4
0
        /// <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("&nbsp;");
                    }
                    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("&nbsp;");
                        }
                    }
                    spaceCount = 0;
                    switch (c)
                    {
                    case '<':
                        w.Write("&lt;");
                        break;

                    case '>':
                        w.Write("&gt;");
                        break;

                    case '&':
                        w.Write("&amp;");
                        break;

                    case '"':
                        w.Write("&quot;");
                        break;

                    default:
                        w.Write(c);
                        break;
                    }
                }
            }
            for (int i = 0; i < spaceCount; i++)
            {
                w.Write("&nbsp;");
            }
        }