From 9fbf247518cabbff0c33e61e77981480fb864ca1 Mon Sep 17 00:00:00 2001 From: iska Date: Tue, 10 Mar 2015 00:11:57 +0100 Subject: [PATCH] Add NSString category methods for comparison ignoring case and use these in the Doctype node and the quirks mode --- HTMLKit/HTMLDocumentType.m | 21 +++++++++++---------- HTMLKit/HTMLQuirksMode.h | 14 +++----------- HTMLKit/NSString+HTMLKit.h | 2 ++ HTMLKit/NSString+HTMLKit.m | 12 ++++++++++++ 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/HTMLKit/HTMLDocumentType.m b/HTMLKit/HTMLDocumentType.m index e6d890b..e63fd16 100644 --- a/HTMLKit/HTMLDocumentType.m +++ b/HTMLKit/HTMLDocumentType.m @@ -7,6 +7,7 @@ // #import "HTMLDocumentType.h" +#import "NSString+HTMLKit.h" NS_INLINE BOOL nilOrEqual(id first, id second) { return (first == nil) || ([first isEqual:second]); @@ -86,13 +87,13 @@ NS_INLINE BOOL nilOrEqual(id first, id second) { return HTMLQuirksModeQuirks; } - if (isEqualCaseInsensitive(_publicIdentifier, @"-//W3O//DTD W3 HTML Strict 3.0//EN//") || - isEqualCaseInsensitive(_publicIdentifier, @"-/W3C/DTD HTML 4.0 Transitional/EN") || - isEqualCaseInsensitive(_publicIdentifier, @"HTML")) { + if ([_publicIdentifier isEqualToStringIgnoringCase:@"-//W3O//DTD W3 HTML Strict 3.0//EN//"] || + [_publicIdentifier isEqualToStringIgnoringCase:@"-/W3C/DTD HTML 4.0 Transitional/EN"] || + [_publicIdentifier isEqualToStringIgnoringCase:@"HTML"]) { return HTMLQuirksModeQuirks; } - if (isEqualCaseInsensitive(_systemIdentifier, @"http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd")) { + if ([_publicIdentifier isEqualToStringIgnoringCase:@"http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"]) { return HTMLQuirksModeQuirks; } @@ -101,21 +102,21 @@ NS_INLINE BOOL nilOrEqual(id first, id second) { } if (_systemIdentifier == nil) { - if (hasPrefixCaseInsensitive(_publicIdentifier, @"-//W3C//DTD HTML 4.01 Frameset//") || - hasPrefixCaseInsensitive(_publicIdentifier, @"-//W3C//DTD HTML 4.01 Transitional//")) { + if ([_publicIdentifier hasPrefixIgnoringCase:@"-//W3C//DTD HTML 4.01 Frameset//"] || + [_publicIdentifier hasPrefixIgnoringCase:@"-//W3C//DTD HTML 4.01 Transitional//"]) { return HTMLQuirksModeQuirks; } } #warning Check "iframe srcdoc" - if (hasPrefixCaseInsensitive(_publicIdentifier, @"-//W3C//DTD XHTML 1.0 Frameset//") || - hasPrefixCaseInsensitive(_publicIdentifier, @"-//W3C//DTD XHTML 1.0 Transitional//")) { + if ([_publicIdentifier hasPrefixIgnoringCase:@"-//W3C//DTD XHTML 1.0 Frameset//"] || + [_publicIdentifier hasPrefixIgnoringCase:@"-//W3C//DTD XHTML 1.0 Transitional//"]) { return HTMLQuirksModeLimitedQuirks; } if (_systemIdentifier != nil) { - if (hasPrefixCaseInsensitive(_publicIdentifier, @"-//W3C//DTD HTML 4.01 Frameset//") || - hasPrefixCaseInsensitive(_publicIdentifier, @"-//W3C//DTD HTML 4.01 Transitional//")) { + if ([_publicIdentifier hasPrefixIgnoringCase:@"-//W3C//DTD HTML 4.01 Frameset//"] || + [_publicIdentifier hasPrefixIgnoringCase:@"-//W3C//DTD HTML 4.01 Transitional//"]) { return HTMLQuirksModeLimitedQuirks; } } diff --git a/HTMLKit/HTMLQuirksMode.h b/HTMLKit/HTMLQuirksMode.h index e5caf19..3ad4920 100644 --- a/HTMLKit/HTMLQuirksMode.h +++ b/HTMLKit/HTMLQuirksMode.h @@ -6,6 +6,8 @@ // Copyright (c) 2015 BrainCookie. All rights reserved. // +#import "NSString+HTMLKit.h" + typedef NS_ENUM(short, HTMLQuirksMode) { HTMLQuirksModeNoQuirks, @@ -76,20 +78,10 @@ static NSString * HTMLQuirksModePrefixes[] = { #undef QUIRKS_ENTRY }; -NS_INLINE BOOL isEqualCaseInsensitive(NSString *first, NSString *second) { - return [first caseInsensitiveCompare:second] == NSOrderedSame; -} - -NS_INLINE BOOL hasPrefixCaseInsensitive(NSString *string, NSString *prefix) { - NSRange reange = [string rangeOfString:prefix - options:NSAnchoredSearch|NSCaseInsensitiveSearch]; - return reange.location != NSNotFound; -} - NS_INLINE BOOL QuirksModePrefixMatch(NSString *publicIdentifier) { for (int i = 0; i < sizeof(HTMLQuirksModePrefixes) / sizeof(HTMLQuirksModePrefixes[0]); i++) { - if (hasPrefixCaseInsensitive(publicIdentifier, HTMLQuirksModePrefixes[i])) { + if ([publicIdentifier hasPrefixIgnoringCase:HTMLQuirksModePrefixes[i]]) { return YES; } } diff --git a/HTMLKit/NSString+HTMLKit.h b/HTMLKit/NSString+HTMLKit.h index 146c89e..5f2e9fd 100644 --- a/HTMLKit/NSString+HTMLKit.h +++ b/HTMLKit/NSString+HTMLKit.h @@ -10,7 +10,9 @@ @interface NSString (HTMLKit) +- (BOOL)isEqualToStringIgnoringCase:(NSString *)aString; - (BOOL)isEqualToAny:(NSString *)first, ... NS_REQUIRES_NIL_TERMINATION; +- (BOOL)hasPrefixIgnoringCase:(NSString *)aString; - (BOOL)isHTMLWhitespaceString; - (BOOL)containsHTMLWhitespace; - (NSUInteger)leadingWhitespaceLength; diff --git a/HTMLKit/NSString+HTMLKit.m b/HTMLKit/NSString+HTMLKit.m index 114ffa2..fe4d8b7 100644 --- a/HTMLKit/NSString+HTMLKit.m +++ b/HTMLKit/NSString+HTMLKit.m @@ -15,6 +15,11 @@ NS_INLINE BOOL isHtmlWhitespaceChar(char c) @implementation NSString (HTMLKit) +- (BOOL)isEqualToStringIgnoringCase:(NSString *)aString +{ + return [self caseInsensitiveCompare:aString] == NSOrderedSame; +} + - (BOOL)isEqualToAny:(NSString *)first, ... NS_REQUIRES_NIL_TERMINATION { va_list list; @@ -28,6 +33,13 @@ NS_INLINE BOOL isHtmlWhitespaceChar(char c) return NO; } +- (BOOL)hasPrefixIgnoringCase:(NSString *)aString +{ + NSRange reange = [self rangeOfString:aString + options:NSAnchoredSearch|NSCaseInsensitiveSearch]; + return reange.location != NSNotFound; +} + - (BOOL)isHTMLWhitespaceString { NSCharacterSet *set = [[NSCharacterSet characterSetWithCharactersInString:@" \t\n\f\r"] invertedSet];