public override int GetLineNumberFromPosition(int position) { if ((position < 0) || (position > this.Length)) { throw new ArgumentOutOfRangeException(nameof(position)); } //Convert position to a position relative to the start of _text. if (position == this.Length) { //Handle positions at the end of the span as a special case since otherwise we //return the incorrect value if the last line break extends past the end of _textSpan. return(this.LineBreakCount); } position += _textSpanStart; int start = _lineBreakSpanStart; int end = this.LineBreakSpanEnd; while (start < end) { int middle = (start + end) / 2; if (position < _lineBreaks.EndOfLineBreak(middle)) { end = middle; } else { start = middle + 1; } } return(start - _lineBreakSpanStart); }
public override LineSpan GetLineFromLineNumber(int lineNumber) { if ((lineNumber < 0) || (lineNumber > this.LineBreakCount)) { throw new ArgumentOutOfRangeException("lineNumber"); } ILineBreaks lineBreaks = _storage.LineBreaks; int absoluteLineNumber = _lineBreakSpanStart + lineNumber; int start = (lineNumber == 0) ? 0 : (Math.Min(this.TextSpanEnd, lineBreaks.EndOfLineBreak(absoluteLineNumber - 1)) - _textSpanStart); int end; int breakLength; if (lineNumber < this.LineBreakCount) { end = Math.Max(_textSpanStart, lineBreaks.StartOfLineBreak(absoluteLineNumber)); breakLength = Math.Min(this.TextSpanEnd, lineBreaks.EndOfLineBreak(absoluteLineNumber)) - end; end -= _textSpanStart; } else { end = this.Length; breakLength = 0; } return(new LineSpan(lineNumber, Span.FromBounds(start, end), breakLength)); }
/// <summary> /// Gets <see cref="Span"/> of whole <paramref name="line"/>. /// </summary> /// <param name="lineBreaks">Information about line breaks in the document. Cannot be <c>null</c>.</param> /// <param name="line">Line number.</param> /// <returns><see cref="Span"/> of line specified by parameter <paramref name="line"/> within the document <paramref name="lineBreaks"/>.</returns> public static Span GetLineSpan(this ILineBreaks /*!*/ lineBreaks, int line) { if (lineBreaks == null) { throw new ArgumentNullException("lineBreaks"); } if (line < 0 || line > lineBreaks.Count) { throw new ArgumentException("line"); } int start = (line != 0) ? lineBreaks.EndOfLineBreak(line - 1) : 0; int end = (line < lineBreaks.Count) ? lineBreaks.EndOfLineBreak(line) : lineBreaks.TextLength; return(Span.FromBounds(start, end)); }