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