in lib/src/scanner.dart [1447:1525]
Token _scanPlainScalar() {
var start = _scanner.state;
var end = _scanner.state;
var buffer = StringBuffer();
var leadingBreak = '';
var trailingBreaks = '';
var whitespace = StringBuffer();
var indent = _indent + 1;
while (true) {
// Check for a document indicator.
if (_isDocumentIndicator) break;
// Check for a comment.
if (_scanner.peekChar() == HASH) break;
if (_isPlainChar) {
// Join the whitespace or fold line breaks.
if (leadingBreak.isNotEmpty) {
if (trailingBreaks.isEmpty) {
buffer.writeCharCode(SP);
} else {
buffer.write(trailingBreaks);
}
leadingBreak = '';
trailingBreaks = '';
} else {
buffer.write(whitespace);
whitespace.clear();
}
}
// libyaml's notion of valid identifiers differs substantially from YAML
// 1.2's. We use [_isPlainChar] instead of libyaml's character here.
var startPosition = _scanner.position;
while (_isPlainChar) {
_scanner.readChar();
}
buffer.write(_scanner.substring(startPosition));
end = _scanner.state;
// Is it the end?
if (!_isBlank && !_isBreak) break;
while (_isBlank || _isBreak) {
if (_isBlank) {
// Check for a tab character messing up the intendation.
if (leadingBreak.isNotEmpty &&
_scanner.column < indent &&
_scanner.peekChar() == TAB) {
_scanner.error('Expected a space but found a tab.', length: 1);
}
if (leadingBreak.isEmpty) {
whitespace.writeCharCode(_scanner.readChar());
} else {
_scanner.readChar();
}
} else {
// Check if it's a first line break.
if (leadingBreak.isEmpty) {
leadingBreak = _readLine();
whitespace.clear();
} else {
trailingBreaks = _readLine();
}
}
}
// Check the indentation level.
if (_inBlockContext && _scanner.column < indent) break;
}
// Allow a simple key after a plain scalar with leading blanks.
if (leadingBreak.isNotEmpty) _simpleKeyAllowed = true;
return ScalarToken(
_scanner.spanFrom(start, end), buffer.toString(), ScalarStyle.PLAIN);
}