diff --git a/HTMLKit/HTMLCharacterToken.h b/HTMLKit/HTMLCharacterToken.h index ce61a9f..56ad1ad 100644 --- a/HTMLKit/HTMLCharacterToken.h +++ b/HTMLKit/HTMLCharacterToken.h @@ -18,5 +18,7 @@ - (void)appendString:(NSString *)string; - (BOOL)isWhitespaceToken; +- (HTMLCharacterToken *)tokenByRetainingLeadingWhitespace; +- (HTMLCharacterToken *)tokenByTrimmingLeadingWhitespace; @end diff --git a/HTMLKit/HTMLCharacterToken.m b/HTMLKit/HTMLCharacterToken.m index 035c627..9255bd1 100644 --- a/HTMLKit/HTMLCharacterToken.m +++ b/HTMLKit/HTMLCharacterToken.m @@ -8,6 +8,19 @@ #import "HTMLCharacterToken.h" +NS_INLINE BOOL isHtmlWhitespace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\r'; +} + +NS_INLINE size_t LeadingWhitespaceLength(NSString *string) +{ + const char *str = string.UTF8String; + size_t idx = 0; + while (isHtmlWhitespace(*str)) { str++; idx++; } + return idx; +} + @interface HTMLCharacterToken () { NSMutableString *_characters; @@ -40,6 +53,26 @@ return [_characters rangeOfCharacterFromSet:set].location == NSNotFound; } +- (HTMLCharacterToken *)tokenByRetainingLeadingWhitespace +{ + size_t index = LeadingWhitespaceLength(_characters); + if (index > 0) { + NSString *leading = [_characters substringToIndex:index]; + return [[HTMLCharacterToken alloc] initWithString:leading]; + } + return nil; +} + +- (HTMLCharacterToken *)tokenByTrimmingLeadingWhitespace +{ + size_t index = LeadingWhitespaceLength(_characters); + if (index < _characters.length) { + NSString *remaining = [_characters substringFromIndex:index]; + return [[HTMLCharacterToken alloc] initWithString:remaining]; + } + return nil; +} + #pragma mark - NSObject - (BOOL)isEqual:(id)other