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()); }
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()); }