diff --git a/HTMLKit.xcodeproj/project.pbxproj b/HTMLKit.xcodeproj/project.pbxproj
index 8ccebac..aba4d35 100644
--- a/HTMLKit.xcodeproj/project.pbxproj
+++ b/HTMLKit.xcodeproj/project.pbxproj
@@ -91,10 +91,6 @@
624AB3181B0508AE00F3830D /* CSSTypeSelectorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624AB3161B0508AE00F3830D /* CSSTypeSelectorTests.m */; };
624AB31A1B050A4D00F3830D /* CSSAttributeSelectorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624AB3191B050A4D00F3830D /* CSSAttributeSelectorTests.m */; };
624AB31B1B050A4D00F3830D /* CSSAttributeSelectorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624AB3191B050A4D00F3830D /* CSSAttributeSelectorTests.m */; };
- 624AB31E1B05373600F3830D /* CSSSimpleSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 624AB31C1B05373600F3830D /* CSSSimpleSequence.h */; };
- 624AB31F1B05373600F3830D /* CSSSimpleSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 624AB31D1B05373600F3830D /* CSSSimpleSequence.m */; };
- 624AB3201B05373600F3830D /* CSSSimpleSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 624AB31D1B05373600F3830D /* CSSSimpleSequence.m */; };
- 624AB3221B053A5800F3830D /* CSSSimpleSelector.h in Headers */ = {isa = PBXBuildFile; fileRef = 624AB3211B053A5800F3830D /* CSSSimpleSelector.h */; };
624AC8FF19FBF59800BD3C4A /* HTMLTokens.h in Headers */ = {isa = PBXBuildFile; fileRef = 624AC8FE19FBF4F700BD3C4A /* HTMLTokens.h */; };
624AC90119FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624AC90019FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m */; };
624AC90219FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624AC90019FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m */; };
@@ -181,6 +177,8 @@
62F873EB19E088C90062683C /* HTMLParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 62F873E919E088C90062683C /* HTMLParser.h */; };
62F873EC19E088C90062683C /* HTMLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 62F873EA19E088C90062683C /* HTMLParser.m */; };
62F873ED19E088C90062683C /* HTMLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 62F873EA19E088C90062683C /* HTMLParser.m */; };
+ 62FC60461BD0519B0042BBE7 /* CSSSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 62FC60451BD0519B0042BBE7 /* CSSSelector.m */; settings = {ASSET_TAGS = (); }; };
+ 62FC60471BD0519B0042BBE7 /* CSSSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 62FC60451BD0519B0042BBE7 /* CSSSelector.m */; settings = {ASSET_TAGS = (); }; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -274,9 +272,6 @@
624AB3151B04EA4200F3830D /* CSSSelectors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CSSSelectors.h; sourceTree = ""; };
624AB3161B0508AE00F3830D /* CSSTypeSelectorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSTypeSelectorTests.m; sourceTree = ""; };
624AB3191B050A4D00F3830D /* CSSAttributeSelectorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSAttributeSelectorTests.m; sourceTree = ""; };
- 624AB31C1B05373600F3830D /* CSSSimpleSequence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSimpleSequence.h; sourceTree = ""; };
- 624AB31D1B05373600F3830D /* CSSSimpleSequence.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSimpleSequence.m; sourceTree = ""; };
- 624AB3211B053A5800F3830D /* CSSSimpleSelector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSimpleSelector.h; sourceTree = ""; };
624AC8FE19FBF4F700BD3C4A /* HTMLTokens.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLTokens.h; sourceTree = ""; };
624AC90019FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLKitTokenizerTests.m; sourceTree = ""; };
624AC90419FBFE8A00BD3C4A /* html5lib-tests */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "html5lib-tests"; sourceTree = ""; };
@@ -340,6 +335,7 @@
62F501641BC9576B0069F47B /* CSSNthExpressionParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSNthExpressionParser.m; sourceTree = ""; };
62F873E919E088C90062683C /* HTMLParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLParser.h; sourceTree = ""; };
62F873EA19E088C90062683C /* HTMLParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLParser.m; sourceTree = ""; };
+ 62FC60451BD0519B0042BBE7 /* CSSSelector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelector.m; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -396,9 +392,7 @@
624B7DDB1B2E3AAB00A4BD61 /* CSSToken.m */,
624B37211B250BB50010BDDF /* CSSTokenizerCodePoints.h */,
62079BE71AF56F1E00D3B402 /* CSSSelector.h */,
- 624AB3211B053A5800F3830D /* CSSSimpleSelector.h */,
- 624AB31C1B05373600F3830D /* CSSSimpleSequence.h */,
- 624AB31D1B05373600F3830D /* CSSSimpleSequence.m */,
+ 62FC60451BD0519B0042BBE7 /* CSSSelector.m */,
624B28B61B03DA820048D328 /* CSSTypeSelector.h */,
624B28B71B03DA820048D328 /* CSSTypeSelector.m */,
624B28BD1B0413200048D328 /* CSSAttributeSelector.h */,
@@ -686,12 +680,10 @@
624493AC19CD0CBE00BCDDF4 /* HTMLToken.h in Headers */,
624B371E1B24E9BA0010BDDF /* CSSInputStream.h in Headers */,
6235CEA01AA5170A0026937B /* HTMLMarker.h in Headers */,
- 624AB31E1B05373600F3830D /* CSSSimpleSequence.h in Headers */,
62F31FDD19E9DCCF007F0657 /* HTMLTokenizerEntities.h in Headers */,
623406E11ADB04F9004677A3 /* HTMLTemplate.h in Headers */,
624B28B81B03DA820048D328 /* CSSTypeSelector.h in Headers */,
6234BEEE1AABBF1400DEB15F /* HTMLStackOfOpenElements.h in Headers */,
- 624AB3221B053A5800F3830D /* CSSSimpleSelector.h in Headers */,
6238C9851AB8D6330006512E /* HTMLKitDOMExceptions.h in Headers */,
6238039F1AB63A8C008A53D0 /* HTMLEOFToken.h in Headers */,
6279F87419E1808D00F12EE5 /* HTMLElement.h in Headers */,
@@ -895,10 +887,10 @@
624717B91B21FE5400B38302 /* HTMLNodeFilter.m in Sources */,
620EE94B1BC46F2A0028ED34 /* CSSPseudoClassSelector.m in Sources */,
624493A819CCC54100BCDDF4 /* HTMLTokenizer.m in Sources */,
- 624AB3201B05373600F3830D /* CSSSimpleSequence.m in Sources */,
623F13AC1AFC11D900C90BF4 /* CSSTokenizer.m in Sources */,
624B28BA1B03DA820048D328 /* CSSTypeSelector.m in Sources */,
625A14BE19C7829400AD0C32 /* HTMLKit.m in Sources */,
+ 62FC60471BD0519B0042BBE7 /* CSSSelector.m in Sources */,
623857981A9E8606003A45D9 /* HTMLDocumentType.m in Sources */,
62AE594B19F9948A0043F069 /* HTMLCharacterToken.m in Sources */,
623458501A9D2FA4009BD491 /* HTMLNode.m in Sources */,
@@ -963,11 +955,11 @@
624717B81B21FE5400B38302 /* HTMLNodeFilter.m in Sources */,
620EE94A1BC46F2A0028ED34 /* CSSPseudoClassSelector.m in Sources */,
624493A719CCC54100BCDDF4 /* HTMLTokenizer.m in Sources */,
- 624AB31F1B05373600F3830D /* CSSSimpleSequence.m in Sources */,
623F13AB1AFC11D900C90BF4 /* CSSTokenizer.m in Sources */,
624B28B91B03DA820048D328 /* CSSTypeSelector.m in Sources */,
625A150219C783DE00AD0C32 /* HTMLKit.m in Sources */,
623857971A9E8606003A45D9 /* HTMLDocumentType.m in Sources */,
+ 62FC60461BD0519B0042BBE7 /* CSSSelector.m in Sources */,
62AE594A19F9948A0043F069 /* HTMLCharacterToken.m in Sources */,
6234584F1A9D2FA4009BD491 /* HTMLNode.m in Sources */,
624B28C01B0413200048D328 /* CSSAttributeSelector.m in Sources */,
diff --git a/HTMLKit/CSSAttributeSelector.h b/HTMLKit/CSSAttributeSelector.h
index a7d9a09..ca343a6 100644
--- a/HTMLKit/CSSAttributeSelector.h
+++ b/HTMLKit/CSSAttributeSelector.h
@@ -7,7 +7,7 @@
//
#import
-#import "CSSSimpleSelector.h"
+#import "CSSSelector.h"
typedef NS_ENUM(NSUInteger, CSSAttributeSelectorType)
{
@@ -21,17 +21,18 @@ typedef NS_ENUM(NSUInteger, CSSAttributeSelectorType)
CSSAttributeSelectorNot
};
-@interface CSSAttributeSelector : NSObject
+@interface CSSAttributeSelector : CSSSelector
@property (nonatomic, assign) CSSAttributeSelectorType type;
-@property (nonatomic, copy) NSString * _Nonnull name;
-@property (nonatomic, copy) NSString * _Nonnull value;
+@property (nonatomic, strong, readonly) NSString * _Nonnull name;
+@property (nonatomic, strong, readonly) NSString * _Nonnull value;
-+ (nullable instancetype)selectorForClass:(nonnull NSString *)className;
-+ (nullable instancetype)selectorForId:(nonnull NSString *)elementId;
++ (nullable instancetype)classSelector:(nonnull NSString *)className;
++ (nullable instancetype)idSelector:(nonnull NSString *)elementId;
++ (nullable instancetype)attributeSelector:(nonnull NSString *)attributeName;
- (nullable instancetype)initWithType:(CSSAttributeSelectorType)type
attributeName:(nonnull NSString *)name
- attrbiuteValue:(nullable NSString *)value;
+ attrbiuteValue:(nonnull NSString *)value;
@end
diff --git a/HTMLKit/CSSAttributeSelector.m b/HTMLKit/CSSAttributeSelector.m
index f73c147..433be22 100644
--- a/HTMLKit/CSSAttributeSelector.m
+++ b/HTMLKit/CSSAttributeSelector.m
@@ -20,16 +20,21 @@
@implementation CSSAttributeSelector
-+ (instancetype)selectorForClass:(NSString *)className
++ (instancetype)classSelector:(NSString *)className
{
return [[self alloc] initWithType:CSSAttributeSelectorIncludes attributeName:@"class" attrbiuteValue:className];
}
-+ (instancetype)selectorForId:(NSString *)elementId
++ (instancetype)idSelector:(NSString *)elementId
{
return [[self alloc] initWithType:CSSAttributeSelectorExactMatch attributeName:@"id" attrbiuteValue:elementId];
}
++ (nullable instancetype)attributeSelector:(nonnull NSString *)attributeName
+{
+ return [[self alloc] initWithType:CSSAttributeSelectorExists attributeName:attributeName attrbiuteValue:@""];
+}
+
- (instancetype)initWithType:(CSSAttributeSelectorType)type
attributeName:(NSString *)name
attrbiuteValue:(NSString *)value
@@ -37,8 +42,8 @@
self = [super init];
if (self) {
self.type = type;
- self.name = [name copy];
- self.value = [value copy];
+ _name = [name copy];
+ _value = [value copy];
}
return self;
}
@@ -84,6 +89,8 @@
}
}
+#pragma mark - Description
+
- (NSString *)debugDescription
{
if (self.type == CSSAttributeSelectorExists) {
@@ -101,9 +108,4 @@
return [NSString stringWithFormat:@"[%@%@'%@']", self.name, matcher, self.value];
}
-- (NSString *)description
-{
- return [NSString stringWithFormat:@"<%@: %p '%@'>", self.class, self, self.debugDescription];
-}
-
@end
diff --git a/HTMLKit/CSSSelector.h b/HTMLKit/CSSSelector.h
index 9d6e210..b16f2a9 100644
--- a/HTMLKit/CSSSelector.h
+++ b/HTMLKit/CSSSelector.h
@@ -10,9 +10,8 @@
@class HTMLElement;
-typedef BOOL (^ CSSSelectorAcceptElementBlock)(HTMLElement * _Nonnull node);
+@interface CSSSelector : NSObject
-@protocol CSSSelector
-@required
- (BOOL)acceptElement:(nonnull HTMLElement *)element;
+
@end
diff --git a/HTMLKit/CSSSelector.m b/HTMLKit/CSSSelector.m
new file mode 100644
index 0000000..f3a8e52
--- /dev/null
+++ b/HTMLKit/CSSSelector.m
@@ -0,0 +1,33 @@
+//
+// CSSSelector.m
+// HTMLKit
+//
+// Created by Iska on 15/10/15.
+// Copyright (c) 2015 BrainCookie. All rights reserved.
+//
+
+#import
+#import "CSSSelector.h"
+
+@implementation CSSSelector
+
+- (BOOL)acceptElement:(HTMLElement *)element
+{
+ [self doesNotRecognizeSelector:_cmd];
+ return NO;
+}
+
+#pragma mark - Description
+
+- (NSString *)debugDescription
+{
+ [self doesNotRecognizeSelector:_cmd];
+ return @"";
+}
+
+- (NSString *)description
+{
+ return [NSString stringWithFormat:@"<%@: %p '%@'>", self.class, self, self.debugDescription];
+}
+
+@end
diff --git a/HTMLKit/CSSSelectors.h b/HTMLKit/CSSSelectors.h
index 50f30b5..c9f9932 100644
--- a/HTMLKit/CSSSelectors.h
+++ b/HTMLKit/CSSSelectors.h
@@ -7,8 +7,6 @@
//
#import "CSSSelector.h"
-#import "CSSSimpleSelector.h"
-#import "CSSSimpleSequence.h"
#import "CSSTypeSelector.h"
#import "CSSAttributeSelector.h"
#import "CSSPseudoClassSelector.h"
diff --git a/HTMLKit/CSSSimpleSelector.h b/HTMLKit/CSSSimpleSelector.h
deleted file mode 100644
index bbaa10a..0000000
--- a/HTMLKit/CSSSimpleSelector.h
+++ /dev/null
@@ -1,14 +0,0 @@
-//
-// CSSSimpleSelector.h
-// HTMLKit
-//
-// Created by Iska on 14/05/15.
-// Copyright (c) 2015 BrainCookie. All rights reserved.
-//
-
-#import
-#import "CSSSelector.h"
-
-@protocol CSSSimpleSelector
-
-@end
diff --git a/HTMLKit/CSSSimpleSequence.h b/HTMLKit/CSSSimpleSequence.h
deleted file mode 100644
index 7bf48be..0000000
--- a/HTMLKit/CSSSimpleSequence.h
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// CSSSimpleSequence.h
-// HTMLKit
-//
-// Created by Iska on 14/05/15.
-// Copyright (c) 2015 BrainCookie. All rights reserved.
-//
-
-#import
-#import "CSSSelector.h"
-#import "CSSSimpleSelector.h"
-
-@class CSSTypeSelector;
-
-@interface CSSSimpleSequence : NSObject
-
-- (nullable instancetype)initWithType:(nonnull CSSTypeSelector *)selector;
-- (nullable instancetype)initWithSelectors:(nonnull NSArray> *)selectors;
-
-- (void)addSelector:(nonnull id)selector;
-
-@end
diff --git a/HTMLKit/CSSSimpleSequence.m b/HTMLKit/CSSSimpleSequence.m
deleted file mode 100644
index e0b8b7e..0000000
--- a/HTMLKit/CSSSimpleSequence.m
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-// CSSSimpleSequence.m
-// HTMLKit
-//
-// Created by Iska on 14/05/15.
-// Copyright (c) 2015 BrainCookie. All rights reserved.
-//
-
-#import "CSSSimpleSequence.h"
-
-@interface CSSSimpleSequence ()
-{
- NSMutableArray *_selectors;
-}
-@end
-
-@implementation CSSSimpleSequence
-
-- (instancetype)init
-{
- return [self initWithSelectors:@[]];
-}
-
-- (instancetype)initWithType:(CSSTypeSelector *)selector
-{
- return [self initWithSelectors:@[selector]];
-}
-
-- (instancetype)initWithSelectors:(NSArray *)selectors
-{
- self = [super init];
- if (self) {
- _selectors = [[NSMutableArray alloc] initWithArray:selectors];
- }
- return self;
-}
-
-- (void)addSelector:(id)selector
-{
- [_selectors addObject:selector];
-}
-
-- (BOOL)acceptElement:(HTMLElement *)element
-{
- for (id selector in _selectors) {
- if (![selector acceptElement:element]) {
- return NO;
- }
- }
- return YES;
-}
-
-- (NSString *)debugDescription
-{
- NSArray *descriptions = [_selectors valueForKey:@"debugDescription"];
- return [descriptions componentsJoinedByString:@""];
-}
-
-- (NSString *)description
-{
- return [NSString stringWithFormat:@"<%@: %p '%@'>", self.class, self, self.debugDescription];
-}
-
-@end
diff --git a/HTMLKit/CSSTypeSelector.h b/HTMLKit/CSSTypeSelector.h
index 0f7ad30..c36ebff 100644
--- a/HTMLKit/CSSTypeSelector.h
+++ b/HTMLKit/CSSTypeSelector.h
@@ -8,11 +8,10 @@
#import
#import "CSSSelector.h"
-#import "CSSSimpleSelector.h"
-@interface CSSTypeSelector : NSObject
+@interface CSSTypeSelector : CSSSelector
-@property (nonatomic, copy) NSString * _Nonnull type;
+@property (nonatomic, strong, readonly) NSString * _Nonnull type;
+ (nullable instancetype)universalSelector;
diff --git a/HTMLKit/CSSTypeSelector.m b/HTMLKit/CSSTypeSelector.m
index 23f26bc..053ec74 100644
--- a/HTMLKit/CSSTypeSelector.m
+++ b/HTMLKit/CSSTypeSelector.m
@@ -27,7 +27,7 @@
{
self = [super init];
if (self) {
- self.type = [type copy];
+ _type = [type copy];
}
return self;
}
@@ -37,18 +37,14 @@
if ([_type isEqualToString:@"*"] || [_type isEqualToStringIgnoringCase:element.tagName]) {
return YES;
}
-
return NO;
}
+#pragma mark - Description
+
- (NSString *)debugDescription
{
return self.type;
}
-- (NSString *)description
-{
- return [NSString stringWithFormat:@"<%@: %p '%@'>", self.class, self, self.debugDescription];
-}
-
@end