Exemple #1
0
 public TextRun(TextBuffer srcTextBuffer, int startAt, int len, WordSpanKind kind)
 {
     this._srcText = srcTextBuffer;
     this._startAt = startAt;
     this._len     = len;
     this._kind    = kind;
 }
Exemple #2
0
 public TextRun(TextBuffer srcTextBuffer, int startAt, int len, WordSpanKind kind)
 {
     _srcText = srcTextBuffer;
     _startAt = startAt;
     _len     = len;
     _kind    = kind;
 }
Exemple #3
0
 public LexWordSpan(int start, ushort len, WordSpanKind kind)
 {
     this.start = start;
     this.len   = len;
     this.kind  = kind;
 }
Exemple #4
0
        public virtual void Lex(TextBuffer textBuffer)
        {
            WordSpanKind lexMode = WordSpanKind.Unknown;

            //simple line break / whitespace lexer
            char[] buffer = textBuffer.UnsafeGetInternalBuffer();
            int    j      = buffer.Length;

            int startIndex = 0;
            int len        = 0;

            spans.Clear();

            for (int i = 0; i < j; ++i)
            {
                char c = buffer[i];
                if (c == '\r')
                {
                    if (len > 0)
                    {
                        //TODO: check if len > int?
                        var newspan = new LexWordSpan(startIndex,
                                                      (ushort)len, lexMode);
                        spans.Add(newspan);

                        startIndex = i;
                        len        = 0;
                    }
                    len++;
                    lexMode = WordSpanKind.NewLine;
                    //if next is '\n'
                    if (i < j - 1)
                    {
                        char c1 = buffer[i + 1];
                        if (c1 == '\n')
                        {
                            //push accum wordspan
                            //
                            //newline wordspan
                            i++;
                            len++;
                            var newspan = new LexWordSpan(startIndex,
                                                          (ushort)len, lexMode);
                            spans.Add(newspan);
                            startIndex += len;
                            len         = 0;
                        }
                        else
                        {
                            var newspan = new LexWordSpan(startIndex,
                                                          (ushort)len, lexMode);
                            spans.Add(newspan);
                            startIndex += len;
                            len         = 0;
                        }
                    }
                    else
                    {
                        //the \r is last char
                        var newspan = new LexWordSpan(startIndex,
                                                      (ushort)len, lexMode);
                        spans.Add(newspan);

                        startIndex += len;
                        len         = 0;
                    }
                }
                else if (c == '\n')
                {
                    //new line?
                    if (len > 0)
                    {
                        //TODO: check if len > int?
                        var newspan = new LexWordSpan(startIndex,
                                                      (ushort)len, lexMode);
                        spans.Add(newspan);
                        startIndex = i;
                        len        = 0;
                    }
                    //
                    lexMode = WordSpanKind.NewLine;
                    var newspan2 = new LexWordSpan(startIndex,
                                                   (ushort)len, lexMode);
                    spans.Add(newspan2);
                    len        = 0;
                    startIndex = i;
                }
                else if (c == '\t')
                {
                    //tab character
                    //
                    if (lexMode != WordSpanKind.Tab)
                    {
                        //flush
                        if (len > 0)
                        {
                            var newspan = new LexWordSpan(startIndex,
                                                          (ushort)len, lexMode);
                            spans.Add(newspan);
                            startIndex = i;
                            len        = 0;
                        }
                    }
                    len++;
                    lexMode = WordSpanKind.Tab;
                }
                else if (char.IsWhiteSpace(c))
                {
                    //whitespace
                    if (lexMode != WordSpanKind.WhiteSpace)
                    {
                        //change mode
                        if (len > 0)
                        {
                            //TODO: check if len > int?
                            var newspan = new LexWordSpan(startIndex,
                                                          (ushort)len, lexMode);
                            spans.Add(newspan);
                            startIndex = i;
                            len        = 0;
                        }
                    }
                    len++;
                    lexMode = WordSpanKind.WhiteSpace;
                }
                else
                {
                    if (lexMode != WordSpanKind.Text)
                    {
                        //change mode
                        if (len > 0)
                        {
                            //TODO: check if len > int?
                            var newspan = new LexWordSpan(startIndex,
                                                          (ushort)len, lexMode);
                            spans.Add(newspan);
                            startIndex = i;
                            len        = 0;
                        }
                    }
                    len++;
                    lexMode = WordSpanKind.Text;
                }
            }
            //
            //finish
            if (len > 0)
            {
                var newspan = new LexWordSpan(startIndex,
                                              (ushort)len, lexMode);
                spans.Add(newspan);
                len = 0;
            }
        }