A ToSlice version of scanBlockScalarBreaks.

This commit is contained in:
Ferdinand Majerech 2014-07-25 23:48:28 +02:00
parent 537c3c06f3
commit 0aa321f8c5

View file

@ -1178,9 +1178,9 @@ final class Scanner
else else
{ {
indent += increment - 1; indent += increment - 1;
auto scalarBreaks = scanBlockScalarBreaks(indent); reader_.sliceBuilder.begin();
breaks = scalarBreaks[0]; endMark = scanBlockScalarBreaksToSlice(indent);
endMark = scalarBreaks[1]; breaks = reader_.sliceBuilder.finish();
} }
dchar[] lineBreak = ""d.dup; dchar[] lineBreak = ""d.dup;
@ -1376,6 +1376,25 @@ final class Scanner
return tuple(reader_.sliceBuilder.finish(), endMark); return tuple(reader_.sliceBuilder.finish(), endMark);
} }
/// Scan line breaks at lower or specified indentation in a block scalar.
///
/// Assumes that the caller is building a slice in Reader, and puts the scanned
/// characters into that slice.
Mark scanBlockScalarBreaksToSlice(const uint indent) @trusted pure nothrow @nogc
{
Mark endMark = reader_.mark;
for(;;)
{
while(reader_.column < indent && reader_.peek() == ' ') { reader_.forward(); }
if(!"\n\r\u0085\u2028\u2029"d.canFind(reader_.peek())) { break; }
reader_.sliceBuilder.write(scanLineBreak());
endMark = reader_.mark;
}
return endMark;
}
/// Scan a qouted flow scalar token with specified quotes. /// Scan a qouted flow scalar token with specified quotes.
/// ///
/// In case of an error, error_ is set. Use throwIfError() to handle this. /// In case of an error, error_ is set. Use throwIfError() to handle this.