Exemple #1
0
        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));
        }
Exemple #3
0
        /// <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));
        }