public TextRun(TextBuffer srcTextBuffer, int startAt, int len, WordSpanKind kind) { this._srcText = srcTextBuffer; this._startAt = startAt; this._len = len; this._kind = kind; }
public TextRun(TextBuffer srcTextBuffer, int startAt, int len, WordSpanKind kind) { _srcText = srcTextBuffer; _startAt = startAt; _len = len; _kind = kind; }
public LexWordSpan(int start, ushort len, WordSpanKind kind) { this.start = start; this.len = len; this.kind = kind; }
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; } }