@ -268,7 +268,12 @@ class Tokenizer {
# Switch to the character reference state.
// DEVIATION: Character reference consumption implemented as a function
return new CharacterToken($this->switchToCharacterReferenceState(self::DATA_STATE));
$outChar = $this->switchToCharacterReferenceState(self::DATA_STATE);
if (strspn($outChar, Data::WHITESPACE)) {
return new WhitespaceToken($outChar); // a character reference is either all whitespace is no whitespace
} else {
return new CharacterToken($outChar);
}
}
# U+003C LESS-THAN SIGN (< )
elseif ($char === '< ') {
@ -295,9 +300,13 @@ class Tokenizer {
// Consume all characters that don't match what is above and emit
// that as a character token instead to prevent having to loop back
// through here every single time.
if (strspn($char, Data::WHITESPACE)) {
return new WhitespaceToken($char.$this->data->consumeWhile(Data::WHITESPACE));
} else {
return new CharacterToken($char.$this->data->consumeUntil("&<\0"));
}
}
}
# 13.2.5.2 RCDATA state
elseif ($this->state === self::RCDATA_STATE) {
@ -310,7 +319,12 @@ class Tokenizer {
# Switch to the character reference state.
// DEVIATION: Character reference consumption implemented as a function
return new CharacterToken($this->switchToCharacterReferenceState(self::RCDATA_STATE));
$outChar = $this->switchToCharacterReferenceState(self::RCDATA_STATE);
if (strspn($outChar, Data::WHITESPACE)) {
return new WhitespaceToken($outChar); // a character reference is either all whitespace is no whitespace
} else {
return new CharacterToken($outChar);
}
}
# U+003C LESS-THAN SIGN (< )
elseif ($char === '< ') {
@ -337,9 +351,13 @@ class Tokenizer {
// Consume all characters that don't match what is above and emit
// that as a character token instead to prevent having to loop back
// through here every single time.
if (strspn($char, Data::WHITESPACE)) {
return new WhitespaceToken($char.$this->data->consumeWhile(Data::WHITESPACE));
} else {
return new CharacterToken($char.$this->data->consumeUntil("&<\0"));
}
}
}
# 13.2.5.3 RAWTEXT state
elseif ($this->state === self::RAWTEXT_STATE) {
@ -371,9 +389,13 @@ class Tokenizer {
// Consume all characters that don't match what is above and emit
// that as a character token instead to prevent having to loop back
// through here every single time.
if (strspn($char, Data::WHITESPACE)) {
return new WhitespaceToken($char.$this->data->consumeWhile(Data::WHITESPACE));
} else {
return new CharacterToken($char.$this->data->consumeUntil("< \0"));
}
}
}
# 13.2.5.4 Script data state
elseif ($this->state === self::SCRIPT_DATA_STATE) {
@ -405,9 +427,13 @@ class Tokenizer {
// Consume all characters that don't match what is above and emit
// that as a character token instead to prevent having to loop back
// through here every single time.
if (strspn($char, Data::WHITESPACE)) {
return new WhitespaceToken($char.$this->data->consumeWhile(Data::WHITESPACE));
} else {
return new CharacterToken($char.$this->data->consumeUntil("< \0"));
}
}
}
# 13.2.5.5 PLAINTEXT state
elseif ($this->state === self::PLAINTEXT_STATE) {
@ -434,9 +460,13 @@ class Tokenizer {
// Consume all characters that don't match what is above and emit
// that as a character token instead to prevent having to loop back
// through here every single time.
if (strspn($char, Data::WHITESPACE)) {
return new WhitespaceToken($char.$this->data->consumeWhile(Data::WHITESPACE));
} else {
return new CharacterToken($char.$this->data->consumeUntil("\0"));
}
}
}
# 13.2.5.6 Tag open state
elseif ($this->state === self::TAG_OPEN_STATE) {
@ -1062,9 +1092,13 @@ class Tokenizer {
// OPTIMIZATION:
// Consume all characters that aren't listed above to prevent having
// to loop back through here every single time.
if (strspn($char, Data::WHITESPACE)) {
return new WhitespaceToken($char.$this->data->consumeWhile(Data::WHITESPACE));
} else {
return new CharacterToken($char.$this->data->consumeUntil("-< \0"));
}
}
}
# 13.2.5.21 Script data escaped dash state
elseif ($this->state === self::SCRIPT_DATA_ESCAPED_DASH_STATE) {
@ -1104,9 +1138,13 @@ class Tokenizer {
# Switch to the script data escaped state.
# Emit the current input character as a character token.
$this->state = self::SCRIPT_DATA_ESCAPED_STATE;
if (strspn($char, Data::WHITESPACE)) {
return new WhitespaceToken($char);
} else {
return new CharacterToken($char);
}
}
}
# 13.2.5.22 Script data escaped dash dash state
elseif ($this->state === self::SCRIPT_DATA_ESCAPED_DASH_DASH_STATE) {
@ -1151,9 +1189,13 @@ class Tokenizer {
# Switch to the script data escaped state.
# Emit the current input character as a character token.
$this->state = self::SCRIPT_DATA_ESCAPED_STATE;
if (strspn($char, Data::WHITESPACE)) {
return new WhitespaceToken($char);
} else {
return new CharacterToken($char);
}
}
}
# 13.2.5.23 Script data escaped less-than sign state
elseif ($this->state === self::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE) {
@ -1313,8 +1355,12 @@ class Tokenizer {
} else {
$this->state = self::SCRIPT_DATA_ESCAPED_STATE;
}
if (strspn($char, Data::WHITESPACE)) {
return new WhitespaceToken($char);
} else {
return new CharacterToken($char);
}
}
# ASCII upper alpha
# ASCII lower alpha
elseif (ctype_alpha($char)) {
@ -1378,9 +1424,13 @@ class Tokenizer {
// OPTIMIZATION:
// Consume all characters that aren't listed above to prevent having
// to loop back through here every single time.
if (strspn($char, Data::WHITESPACE)) {
return new WhitespaceToken($char.$this->data->consumeWhile(Data::WHITESPACE));
} else {
return new CharacterToken($char.$this->data->consumeUntil("-< \0"));
}
}
}
# 13.2.5.28 Script data double escaped dash state
elseif ($this->state == self::SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE) {
@ -1422,9 +1472,13 @@ class Tokenizer {
# Switch to the script data double escaped state.
# Emit the current input character as a character token.
$this->state = self::SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
if (strspn($char, Data::WHITESPACE)) {
return new WhitespaceToken($char);
} else {
return new CharacterToken($char);
}
}
}
# 13.2.5.29 Script data double escaped dash dash state
elseif ($this->state == self::SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE) {
@ -1471,9 +1525,13 @@ class Tokenizer {
# Switch to the script data double escaped state.
# Emit the current input character as a character token.
$this->state = self::SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
if (strspn($char, Data::WHITESPACE)) {
return new WhitespaceToken($char);
} else {
return new CharacterToken($char);
}
}
}
# 13.2.5.30 Script data double escaped less-than sign state
elseif ($this->state === self::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE) {
@ -1518,8 +1576,12 @@ class Tokenizer {
} else {
$this->state = self::SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
}
if (strspn($char, Data::WHITESPACE)) {
return new WhitespaceToken($char);
} else {
return new CharacterToken($char);
}
}
# ASCII upper alpha
# ASCII lower alpha
elseif (ctype_alpha($char)) {
@ -3344,9 +3406,13 @@ class Tokenizer {
// OPTIMIZATION:
// Consume all characters that aren't listed above to prevent having
// to loop back through here every single time.
if (strspn($char, Data::WHITESPACE)) {
return new WhitespaceToken($char.$this->data->consumeWhile(Data::WHITESPACE));
} else {
return new CharacterToken($char.$this->data->consumeUntil(']'));
}
}
}
# 13.2.5.70 CDATA section bracket state
elseif ($this->state === self::CDATA_SECTION_BRACKET_STATE) {
@ -3378,7 +3444,7 @@ class Tokenizer {
# Emit a U+005D RIGHT SQUARE BRACKET character token.
// OTPIMIZATION: Consume any additional right square brackets
return new CharacterToken($char .$this->data->consumeWhile(']'));
return new CharacterToken(']' .$this->data->consumeWhile(']'));
}
# U+003E GREATER-THAN SIGN character
elseif ($char === '>') {