// todo: move to version control backend IEnumerable <Conflict> Conflicts(Mono.TextEditor.Document doc) { foreach (int mergeStart in doc.SearchForward("<<<<<<<", 0)) { LineSegment start = doc.GetLineByOffset(mergeStart); if (start.Offset != mergeStart) { continue; } int dividerOffset = doc.SearchForward("=======", mergeStart).First(); LineSegment divider = doc.GetLineByOffset(dividerOffset); int endOffset = doc.SearchForward(">>>>>>>", dividerOffset).First(); LineSegment end = doc.GetLineByOffset(endOffset); yield return(new Conflict(new Mono.TextEditor.Segment(start.EndOffset, divider.Offset - start.EndOffset), new Mono.TextEditor.Segment(divider.EndOffset, end.Offset - divider.EndOffset), new Mono.TextEditor.Segment(start), new Mono.TextEditor.Segment(divider), new Mono.TextEditor.Segment(end))); } }
internal static int ScanWord (Document doc, int offset, bool forwardDirection) { if (offset < 0 || offset >= doc.Length) return offset; var line = doc.GetLineByOffset (offset); char first = doc.GetCharAt (offset); while (offset >= line.Offset && offset < line.Offset + line.EditableLength) { char ch = doc.GetCharAt (offset); if (char.IsWhiteSpace (first) && !char.IsWhiteSpace (ch) || IsNoLetterOrDigit (first) && !IsNoLetterOrDigit (ch) || (char.IsLetterOrDigit (first) || first == '_') && !(char.IsLetterOrDigit (ch) || ch == '_')) break; offset = forwardDirection ? offset + 1 : offset - 1; } return System.Math.Min (line.Offset + line.EditableLength, System.Math.Max (line.Offset, offset + (forwardDirection ? 0 : 1))); }
int GetLastSourceCodePosition (Document document, int lineOffset) { LineSegment line = document.GetLineByOffset (lineOffset); bool isInBlockComment = false; bool isInLineComment = false; int curStringQuote = -1; List<string> lineComments = GetList (document, "LineComment"); List<string> blockCommentStarts = GetList (document, "BlockCommentStart"); List<string> blockCommentEnds = GetList (document, "BlockCommentEnd"); List<string> stringQuotes = GetList (document, "StringQuote"); for (int i = 0 ; i < line.EditableLength; i++) { int offset = line.Offset + i; // check line comments if (!isInBlockComment && curStringQuote < 0) { isInLineComment = StartsWithListMember (document, lineComments, offset) >= 0; if (isInLineComment) return System.Math.Min (offset, lineOffset); } // check block comments if (!isInLineComment && curStringQuote < 0) { if (!isInBlockComment) { isInBlockComment = StartsWithListMember (document, blockCommentStarts, offset) >= 0; } else { isInBlockComment = StartsWithListMember (document, blockCommentEnds, offset) < 0; } } if (!isInBlockComment && !isInLineComment) { int j = StartsWithListMember (document, stringQuotes, offset); if (j >= 0) { if (curStringQuote >= 0) { if (curStringQuote == j) curStringQuote = -1; } else { curStringQuote = j; } } } } return lineOffset; }
static string GenerateRtf (Document doc, Mono.TextEditor.Highlighting.SyntaxMode mode, Mono.TextEditor.Highlighting.Style style, ITextEditorOptions options) { StringBuilder rtfText = new StringBuilder (); List<Gdk.Color> colorList = new List<Gdk.Color> (); ISegment selection = new Segment (0, doc.Length); LineSegment line = doc.GetLineByOffset (selection.Offset); LineSegment endLine = doc.GetLineByOffset (selection.EndOffset); RedBlackTree<LineSegmentTree.TreeNode>.RedBlackTreeIterator iter = line.Iter; bool isItalic = false; bool isBold = false; int curColor = -1; do { bool appendSpace = false; line = iter.Current; for (Chunk chunk = mode.GetChunks (doc, style, line, line.Offset, line.EditableLength); chunk != null; chunk = chunk.Next) { int start = System.Math.Max (selection.Offset, chunk.Offset); int end = System.Math.Min (chunk.EndOffset, selection.EndOffset); ChunkStyle chunkStyle = chunk.GetChunkStyle (style); if (start < end) { if (isBold != chunkStyle.Bold) { rtfText.Append (chunkStyle.Bold ? @"\b" : @"\b0"); isBold = chunkStyle.Bold; appendSpace = true; } if (isItalic != chunkStyle.Italic) { rtfText.Append (chunkStyle.Italic ? @"\i" : @"\i0"); isItalic = chunkStyle.Italic; appendSpace = true; } if (!colorList.Contains (chunkStyle.Color)) colorList.Add (chunkStyle.Color); int color = colorList.IndexOf (chunkStyle.Color); if (curColor != color) { curColor = color; rtfText.Append (@"\cf" + (curColor + 1)); appendSpace = true; } for (int i = start; i < end; i++) { char ch = chunk.GetCharAt (doc, i); switch (ch) { case '\\': rtfText.Append (@"\\"); break; case '{': rtfText.Append (@"\{"); break; case '}': rtfText.Append (@"\}"); break; case '\t': rtfText.Append (@"\tab"); appendSpace = true; break; default: if (appendSpace) { rtfText.Append (' '); appendSpace = false; } rtfText.Append (ch); break; } } } } if (line == endLine) break; rtfText.Append (@"\par"); rtfText.AppendLine (); } while (iter.MoveNext ()); // color table StringBuilder colorTable = new StringBuilder (); colorTable.Append (@"{\colortbl ;"); for (int i = 0; i < colorList.Count; i++) { Gdk.Color color = colorList[i]; colorTable.Append (@"\red"); colorTable.Append (color.Red / 256); colorTable.Append (@"\green"); colorTable.Append (color.Green / 256); colorTable.Append (@"\blue"); colorTable.Append (color.Blue / 256); colorTable.Append (";"); } colorTable.Append ("}"); StringBuilder 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 (colorTable.ToString ()); 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("}"); // System.Console.WriteLine(rtf); return rtf.ToString (); }
bool StartsInLineComment (Document document, int offset) { List<string> lineComments = GetList (document, "LineComment"); LineSegment line = document.GetLineByOffset (offset); for (int i = line.Offset ; i < offset; i++) { if (StartsWithListMember (document, lineComments, i) >= 0) return true; } return false; }