in lib/src/tokenizer.dart [1540:1594]
bool afterDoctypeNameState() {
var data = stream.char();
if (isWhitespace(data)) {
return true;
} else if (data == '>') {
_addToken(currentToken!);
state = dataState;
} else if (data == eof) {
currentDoctypeToken.correct = false;
stream.unget(data);
_addToken(ParseErrorToken('eof-in-doctype'));
_addToken(currentToken!);
state = dataState;
} else {
if (data == 'p' || data == 'P') {
// TODO(jmesserly): would be nice to have a helper for this.
var matched = true;
for (var expected in const ['uU', 'bB', 'lL', 'iI', 'cC']) {
data = stream.char();
if (data == eof || !expected.contains(data!)) {
matched = false;
break;
}
}
if (matched) {
state = afterDoctypePublicKeywordState;
return true;
}
} else if (data == 's' || data == 'S') {
var matched = true;
for (var expected in const ['yY', 'sS', 'tT', 'eE', 'mM']) {
data = stream.char();
if (data == eof || !expected.contains(data!)) {
matched = false;
break;
}
}
if (matched) {
state = afterDoctypeSystemKeywordState;
return true;
}
}
// All the characters read before the current 'data' will be
// [a-zA-Z], so they're garbage in the bogus doctype and can be
// discarded; only the latest character might be '>' or EOF
// and needs to be ungetted
stream.unget(data);
_addToken(ParseErrorToken('expected-space-or-right-bracket-in-doctype',
messageParams: {'data': data}));
currentDoctypeToken.correct = false;
state = bogusDoctypeState;
}
return true;
}