Refactor selectors code

- Remove simple sequence
- Remove simple selector protocol
- Let selectors subclass CSSSelector directly
This commit is contained in:
iska
2015-10-18 22:36:03 +02:00
parent 9905f45e27
commit c44c77d63d
11 changed files with 65 additions and 145 deletions
+6 -14
View File
@@ -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 = "<group>"; };
624AB3161B0508AE00F3830D /* CSSTypeSelectorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSTypeSelectorTests.m; sourceTree = "<group>"; };
624AB3191B050A4D00F3830D /* CSSAttributeSelectorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSAttributeSelectorTests.m; sourceTree = "<group>"; };
624AB31C1B05373600F3830D /* CSSSimpleSequence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSimpleSequence.h; sourceTree = "<group>"; };
624AB31D1B05373600F3830D /* CSSSimpleSequence.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSimpleSequence.m; sourceTree = "<group>"; };
624AB3211B053A5800F3830D /* CSSSimpleSelector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSimpleSelector.h; sourceTree = "<group>"; };
624AC8FE19FBF4F700BD3C4A /* HTMLTokens.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLTokens.h; sourceTree = "<group>"; };
624AC90019FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLKitTokenizerTests.m; sourceTree = "<group>"; };
624AC90419FBFE8A00BD3C4A /* html5lib-tests */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "html5lib-tests"; sourceTree = "<group>"; };
@@ -340,6 +335,7 @@
62F501641BC9576B0069F47B /* CSSNthExpressionParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSNthExpressionParser.m; sourceTree = "<group>"; };
62F873E919E088C90062683C /* HTMLParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLParser.h; sourceTree = "<group>"; };
62F873EA19E088C90062683C /* HTMLParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLParser.m; sourceTree = "<group>"; };
62FC60451BD0519B0042BBE7 /* CSSSelector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelector.m; sourceTree = "<group>"; };
/* 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 */,
+8 -7
View File
@@ -7,7 +7,7 @@
//
#import <Foundation/Foundation.h>
#import "CSSSimpleSelector.h"
#import "CSSSelector.h"
typedef NS_ENUM(NSUInteger, CSSAttributeSelectorType)
{
@@ -21,17 +21,18 @@ typedef NS_ENUM(NSUInteger, CSSAttributeSelectorType)
CSSAttributeSelectorNot
};
@interface CSSAttributeSelector : NSObject <CSSSimpleSelector>
@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
+11 -9
View File
@@ -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
+2 -3
View File
@@ -10,9 +10,8 @@
@class HTMLElement;
typedef BOOL (^ CSSSelectorAcceptElementBlock)(HTMLElement * _Nonnull node);
@interface CSSSelector : NSObject
@protocol CSSSelector <NSObject>
@required
- (BOOL)acceptElement:(nonnull HTMLElement *)element;
@end
+33
View File
@@ -0,0 +1,33 @@
//
// CSSSelector.m
// HTMLKit
//
// Created by Iska on 15/10/15.
// Copyright (c) 2015 BrainCookie. All rights reserved.
//
#import <Foundation/Foundation.h>
#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
-2
View File
@@ -7,8 +7,6 @@
//
#import "CSSSelector.h"
#import "CSSSimpleSelector.h"
#import "CSSSimpleSequence.h"
#import "CSSTypeSelector.h"
#import "CSSAttributeSelector.h"
#import "CSSPseudoClassSelector.h"
-14
View File
@@ -1,14 +0,0 @@
//
// CSSSimpleSelector.h
// HTMLKit
//
// Created by Iska on 14/05/15.
// Copyright (c) 2015 BrainCookie. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "CSSSelector.h"
@protocol CSSSimpleSelector <CSSSelector>
@end
-22
View File
@@ -1,22 +0,0 @@
//
// CSSSimpleSequence.h
// HTMLKit
//
// Created by Iska on 14/05/15.
// Copyright (c) 2015 BrainCookie. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "CSSSelector.h"
#import "CSSSimpleSelector.h"
@class CSSTypeSelector;
@interface CSSSimpleSequence : NSObject <CSSSelector>
- (nullable instancetype)initWithType:(nonnull CSSTypeSelector *)selector;
- (nullable instancetype)initWithSelectors:(nonnull NSArray<id<CSSSimpleSelector>> *)selectors;
- (void)addSelector:(nonnull id<CSSSimpleSelector>)selector;
@end
-64
View File
@@ -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<CSSSimpleSelector>)selector
{
[_selectors addObject:selector];
}
- (BOOL)acceptElement:(HTMLElement *)element
{
for (id<CSSSelector> 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
+2 -3
View File
@@ -8,11 +8,10 @@
#import <Foundation/Foundation.h>
#import "CSSSelector.h"
#import "CSSSimpleSelector.h"
@interface CSSTypeSelector : NSObject <CSSSimpleSelector>
@interface CSSTypeSelector : CSSSelector
@property (nonatomic, copy) NSString * _Nonnull type;
@property (nonatomic, strong, readonly) NSString * _Nonnull type;
+ (nullable instancetype)universalSelector;
+3 -7
View File
@@ -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