diff --git a/HTMLKit/HTMLInputStreamReader.h b/HTMLKit/HTMLInputStreamReader.h index 061c925..1cc77f9 100644 --- a/HTMLKit/HTMLInputStreamReader.h +++ b/HTMLKit/HTMLInputStreamReader.h @@ -26,6 +26,7 @@ typedef void (^ HTMLStreamReaderErrorCallback)(NSString *reason); - (UTF32Char)nextInputCharacter; - (UTF32Char)consumeNextInputCharacter; +- (void)reconsumeCurrentInputCharacter; - (void)unconsumeCurrentInputCharacter; - (BOOL)consumeCharacter:(UTF32Char)character; diff --git a/HTMLKit/HTMLInputStreamReader.m b/HTMLKit/HTMLInputStreamReader.m index 949898d..987e23c 100644 --- a/HTMLKit/HTMLInputStreamReader.m +++ b/HTMLKit/HTMLInputStreamReader.m @@ -21,6 +21,8 @@ UTF32Char _currentInputCharacter; NSUInteger _consume; HTMLStreamReaderErrorCallback _errorCallback; + + BOOL _reconsume; } @end @@ -60,6 +62,11 @@ - (UTF32Char)nextInputCharacter { + if (_reconsume) { + _reconsume = NO; + return _currentInputCharacter; + } + _consume = 0; UTF32Char nextInputCharacter = CFStringGetCharacterFromInlineBuffer(&_buffer, _location); @@ -101,6 +108,11 @@ - (UTF32Char)consumeNextInputCharacter { + if (_reconsume) { + _reconsume = NO; + return _currentInputCharacter; + } + UTF32Char nextInputCharacter = [self nextInputCharacter]; _location += _consume; _scanner.scanLocation = _location; @@ -189,6 +201,11 @@ return consumed; } +- (void)reconsumeCurrentInputCharacter +{ + _reconsume = YES; +} + - (void)unconsumeCurrentInputCharacter { _location -= _consume; diff --git a/HTMLKit/HTMLTokenizer.m b/HTMLKit/HTMLTokenizer.m index 4fcf73d..e0a3121 100644 --- a/HTMLKit/HTMLTokenizer.m +++ b/HTMLKit/HTMLTokenizer.m @@ -538,13 +538,13 @@ case QUESTION_MARK: [self emitParseError:@"Bogus (0x003F, ?) in Tag Open state"]; [self switchToState:HTMLTokenizerStateBogusComment]; - [_inputStreamReader unconsumeCurrentInputCharacter]; + [_inputStreamReader reconsumeCurrentInputCharacter]; break; default: [self emitParseError:@"Unexpected character (%X) in Tag Open state", character]; [self switchToState:HTMLTokenizerStateData]; [self emitCharacterToken:LESS_THAN_SIGN]; - [_inputStreamReader unconsumeCurrentInputCharacter]; + [_inputStreamReader reconsumeCurrentInputCharacter]; break; } } @@ -569,12 +569,12 @@ [self emitParseError:@"EOF reached in End Tag Open state"]; [self switchToState:HTMLTokenizerStateData]; [self emitCharacterTokenWithString:@""]; [self emitCharacterTokenWithString:characters]; -#warning Check if necessary if ([_inputStreamReader consumeNextInputCharacter] == (UTF32Char)EOF) { - [_inputStreamReader unconsumeCurrentInputCharacter]; + [_inputStreamReader reconsumeCurrentInputCharacter]; } }