예제 #1
0
        /// <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());
        }
예제 #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.</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());
        }
예제 #3
0
        /// <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("&nbsp;");
                    }
                    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("&nbsp;");
                        }
                    }
                    spaceCount = 0;
                    switch (c)
                    {
                    case '<':
                        b.Append("&lt;");
                        break;

                    case '>':
                        b.Append("&gt;");
                        break;

                    case '&':
                        b.Append("&amp;");
                        break;

                    case '"':
                        b.Append("&quot;");
                        break;

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