Ejemplo n.º 1
0
        public static string GenerateHtml(TextDocument doc, Mono.TextEditor.Highlighting.ISyntaxMode mode, Mono.TextEditor.Highlighting.ColorScheme style, ITextEditorOptions options)
        {
            var htmlText = new StringBuilder();

            htmlText.Append(@"<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN""><HTML><BODY>");

            var selection       = new TextSegment(0, doc.TextLength);
            int startLineNumber = doc.OffsetToLineNumber(selection.Offset);
            int endLineNumber   = doc.OffsetToLineNumber(selection.EndOffset);

            htmlText.Append("<FONT face = '" + options.Font.Family + "'>");
            bool first = true;

            foreach (var line in doc.GetLinesBetween(startLineNumber, endLineNumber))
            {
                if (!first)
                {
                    htmlText.Append("<BR/>");
                }
                else
                {
                    first = false;
                }

                if (mode == null)
                {
                    AppendHtmlText(htmlText, doc, options, System.Math.Max(selection.Offset, line.Offset), System.Math.Min(line.EndOffset, selection.EndOffset));
                    continue;
                }

                foreach (var chunk in mode.GetChunks(style, line, line.Offset, line.Length))
                {
                    int start      = System.Math.Max(selection.Offset, chunk.Offset);
                    int end        = System.Math.Min(chunk.EndOffset, selection.EndOffset);
                    var chunkStyle = style.GetChunkStyle(chunk);
                    if (start < end)
                    {
                        htmlText.Append("<SPAN style = '");
                        if (chunkStyle.FontWeight != Xwt.Drawing.FontWeight.Normal)
                        {
                            htmlText.Append("font-weight:" + ((int)chunkStyle.FontWeight) + ";");
                        }
                        if (chunkStyle.FontStyle != Xwt.Drawing.FontStyle.Normal)
                        {
                            htmlText.Append("font-style:" + chunkStyle.FontStyle.ToString().ToLower() + ";");
                        }
                        htmlText.Append("color:" + ((HslColor)chunkStyle.Foreground).ToPangoString() + ";");
                        htmlText.Append("' >");
                        AppendHtmlText(htmlText, doc, options, start, end);
                        htmlText.Append("</SPAN>");
                    }
                }
            }
            htmlText.Append("</FONT>");
            htmlText.Append("</BODY></HTML>");
            return(htmlText.ToString());
        }
Ejemplo n.º 2
0
        public static string GenerateRtf(TextDocument doc, Mono.TextEditor.Highlighting.ISyntaxMode mode, Mono.TextEditor.Highlighting.ColorScheme style, ITextEditorOptions options)
        {
            var rtfText   = new StringBuilder();
            var colorList = new List <Cairo.Color> ();

            var selection       = new TextSegment(0, doc.TextLength);
            int startLineNumber = doc.OffsetToLineNumber(selection.Offset);
            int endLineNumber   = doc.OffsetToLineNumber(selection.EndOffset);

            bool isItalic = false;
            bool isBold   = false;
            int  curColor = -1;

            foreach (var line in doc.GetLinesBetween(startLineNumber, endLineNumber))
            {
                bool appendSpace = false;
                if (mode == null)
                {
                    AppendRtfText(rtfText, doc, System.Math.Max(selection.Offset, line.Offset), System.Math.Min(line.EndOffset, selection.EndOffset), ref appendSpace);
                    continue;
                }
                foreach (var chunk in mode.GetChunks(style, line, line.Offset, line.Length))
                {
                    int start      = System.Math.Max(selection.Offset, chunk.Offset);
                    int end        = System.Math.Min(chunk.EndOffset, selection.EndOffset);
                    var chunkStyle = style.GetChunkStyle(chunk);
                    if (start < end)
                    {
                        if (isBold != (chunkStyle.FontWeight == Xwt.Drawing.FontWeight.Bold))
                        {
                            isBold = chunkStyle.FontWeight == Xwt.Drawing.FontWeight.Bold;
                            rtfText.Append(isBold ? @"\b" : @"\b0");
                            appendSpace = true;
                        }
                        if (isItalic != (chunkStyle.FontStyle == Xwt.Drawing.FontStyle.Italic))
                        {
                            isItalic = chunkStyle.FontStyle == Xwt.Drawing.FontStyle.Italic;
                            rtfText.Append(isItalic ? @"\i" : @"\i0");
                            appendSpace = true;
                        }
                        var foreground = style.GetForeground(chunkStyle);
                        if (!colorList.Contains(foreground))
                        {
                            colorList.Add(foreground);
                        }
                        int color = colorList.IndexOf(foreground);
                        if (curColor != color)
                        {
                            curColor = color;
                            rtfText.Append(@"\cf" + (curColor + 1));
                            appendSpace = true;
                        }
                        AppendRtfText(rtfText, doc, start, end, ref appendSpace);
                    }
                }
                rtfText.Append(@"\par");
                rtfText.AppendLine();
            }

            var rtf = new StringBuilder();

            rtf.Append(@"{\rtf1\ansi\deff0\adeflang1025");

            // font table
            rtf.Append(@"{\fonttbl");

            rtf.Append(@"{\f0\fnil\fprq1\fcharset128 " + options.Font.Family + ";}");

            rtf.Append("}");

            rtf.Append(CreateColorTable(colorList));

            rtf.Append(@"\viewkind4\uc1\pard");

            rtf.Append(@"\f0");
            try {
                string fontName = options.Font.ToString();
                double fontSize = Double.Parse(fontName.Substring(fontName.LastIndexOf(' ') + 1), System.Globalization.CultureInfo.InvariantCulture) * 2;
                rtf.Append(@"\fs");
                rtf.Append(fontSize);
            } catch (Exception) {};
            rtf.Append(@"\cf1");
            rtf.Append(rtfText.ToString());
            rtf.Append("}");
            return(rtf.ToString());
        }