in src/StructuredLogger/TextUtilities.cs [17:113]
public static void CollectLineSpans(this string text, ICollection<Span> spans, bool includeLineBreakInSpan = true)
{
if (text == null)
{
throw new ArgumentNullException(nameof(text));
}
if (spans == null)
{
throw new ArgumentNullException(nameof(spans));
}
if (text.Length == 0)
{
return;
}
int currentPosition = 0;
int currentLineLength = 0;
bool previousWasCarriageReturn = false;
for (int i = 0; i < text.Length; i++)
{
var ch = text[i];
if (ch == '\r')
{
if (previousWasCarriageReturn)
{
int lineLengthIncludingLineBreak = currentLineLength;
if (!includeLineBreakInSpan)
{
currentLineLength--;
}
spans.Add(new Span(currentPosition, currentLineLength));
currentPosition += lineLengthIncludingLineBreak;
currentLineLength = 1;
}
else
{
currentLineLength++;
previousWasCarriageReturn = true;
}
}
else if (ch == '\n')
{
var lineLength = currentLineLength;
if (previousWasCarriageReturn)
{
lineLength--;
}
currentLineLength++;
previousWasCarriageReturn = false;
if (includeLineBreakInSpan)
{
lineLength = currentLineLength;
}
spans.Add(new Span(currentPosition, lineLength));
currentPosition += currentLineLength;
currentLineLength = 0;
}
else
{
if (previousWasCarriageReturn)
{
var lineLength = currentLineLength;
if (!includeLineBreakInSpan)
{
lineLength--;
}
spans.Add(new Span(currentPosition, lineLength));
currentPosition += currentLineLength;
currentLineLength = 0;
previousWasCarriageReturn = false;
}
currentLineLength++;
}
}
var finalLength = currentLineLength;
if (previousWasCarriageReturn && !includeLineBreakInSpan)
{
finalLength--;
}
spans.Add(new Span(currentPosition, finalLength));
if (previousWasCarriageReturn)
{
spans.Add(new Span(currentPosition, 0));
}
}