Add NSString category methods for comparison ignoring case

and use these in the Doctype node and the quirks mode
This commit is contained in:
iska
2015-03-10 00:11:57 +01:00
parent 91e2e3c5a3
commit 9fbf247518
4 changed files with 28 additions and 21 deletions
+11 -10
View File
@@ -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;
}
}
+3 -11
View File
@@ -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;
}
}
+2
View File
@@ -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;
+12
View File
@@ -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];