in src/worker-html.js [1640:1736]
EntityParser.consumeEntity = function(buffer, tokenizer, additionalAllowedCharacter) {
var decodedCharacter = '';
var consumedCharacters = '';
var ch = buffer.char();
if (ch === InputStream.EOF)
return false;
consumedCharacters += ch;
if (ch == '\t' || ch == '\n' || ch == '\v' || ch == ' ' || ch == '<' || ch == '&') {
buffer.unget(consumedCharacters);
return false;
}
if (additionalAllowedCharacter === ch) {
buffer.unget(consumedCharacters);
return false;
}
if (ch == '#') {
ch = buffer.shift(1);
if (ch === InputStream.EOF) {
tokenizer._parseError("expected-numeric-entity-but-got-eof");
buffer.unget(consumedCharacters);
return false;
}
consumedCharacters += ch;
var radix = 10;
var isDigit = isDecimalDigit;
if (ch == 'x' || ch == 'X') {
radix = 16;
isDigit = isHexDigit;
ch = buffer.shift(1);
if (ch === InputStream.EOF) {
tokenizer._parseError("expected-numeric-entity-but-got-eof");
buffer.unget(consumedCharacters);
return false;
}
consumedCharacters += ch;
}
if (isDigit(ch)) {
var code = '';
while (ch !== InputStream.EOF && isDigit(ch)) {
code += ch;
ch = buffer.char();
}
code = parseInt(code, radix);
var replacement = this.replaceEntityNumbers(code);
if (replacement) {
tokenizer._parseError("invalid-numeric-entity-replaced");
code = replacement;
}
if (code > 0xFFFF && code <= 0x10FFFF) {
code -= 0x10000;
var first = ((0xffc00 & code) >> 10) + 0xD800;
var second = (0x3ff & code) + 0xDC00;
decodedCharacter = String.fromCharCode(first, second);
} else
decodedCharacter = String.fromCharCode(code);
if (ch !== ';') {
tokenizer._parseError("numeric-entity-without-semicolon");
buffer.unget(ch);
}
return decodedCharacter;
}
buffer.unget(consumedCharacters);
tokenizer._parseError("expected-numeric-entity");
return false;
}
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
var mostRecentMatch = '';
while (namedEntityPrefixes[consumedCharacters]) {
if (entities[consumedCharacters]) {
mostRecentMatch = consumedCharacters;
}
if (ch == ';')
break;
ch = buffer.char();
if (ch === InputStream.EOF)
break;
consumedCharacters += ch;
}
if (!mostRecentMatch) {
tokenizer._parseError("expected-named-entity");
buffer.unget(consumedCharacters);
return false;
}
decodedCharacter = entities[mostRecentMatch];
if (ch === ';' || !additionalAllowedCharacter || !(isAlphaNumeric(ch) || ch === '=')) {
if (consumedCharacters.length > mostRecentMatch.length) {
buffer.unget(consumedCharacters.substring(mostRecentMatch.length));
}
if (ch !== ';') {
tokenizer._parseError("named-entity-without-semicolon");
}
return decodedCharacter;
}
buffer.unget(consumedCharacters);
return false;
}
};