in lib/src/scanner.dart [995:1036]
Token _scanTag() {
String? handle;
String suffix;
var start = _scanner.state;
// Check if the tag is in the canonical form.
if (_scanner.peekChar(1) == LEFT_ANGLE) {
// Eat '!<'.
_scanner.readChar();
_scanner.readChar();
handle = '';
suffix = _scanTagUri();
_scanner.expect('>');
} else {
// The tag has either the '!suffix' or the '!handle!suffix' form.
// First, try to scan a handle.
handle = _scanTagHandle();
if (handle.length > 1 && handle.startsWith('!') && handle.endsWith('!')) {
suffix = _scanTagUri(flowSeparators: false);
} else {
suffix = _scanTagUri(head: handle, flowSeparators: false);
// There was no explicit handle.
if (suffix.isEmpty) {
// This is the special '!' tag.
handle = null;
suffix = '!';
} else {
handle = '!';
}
}
}
// libyaml insists on whitespace after a tag, but example 7.2 indicates
// that it's not required: http://yaml.org/spec/1.2/spec.html#id2786720.
return TagToken(_scanner.spanFrom(start), handle, suffix);
}