diff --git a/HTMLKit.xcodeproj/project.pbxproj b/HTMLKit.xcodeproj/project.pbxproj index 4ccd890..a7e55f8 100644 --- a/HTMLKit.xcodeproj/project.pbxproj +++ b/HTMLKit.xcodeproj/project.pbxproj @@ -188,6 +188,8 @@ 62FA04E31BCC360D009ABF98 /* CSSCombinatorSelector.h in Headers */ = {isa = PBXBuildFile; fileRef = 62FA04E11BCC360D009ABF98 /* CSSCombinatorSelector.h */; settings = {ASSET_TAGS = (); }; }; 62FA04E41BCC360D009ABF98 /* CSSCombinatorSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 62FA04E21BCC360D009ABF98 /* CSSCombinatorSelector.m */; settings = {ASSET_TAGS = (); }; }; 62FA04E51BCC360D009ABF98 /* CSSCombinatorSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 62FA04E21BCC360D009ABF98 /* CSSCombinatorSelector.m */; settings = {ASSET_TAGS = (); }; }; + 62FA98041BD57B6200A2AF86 /* CSSSelectors.m in Sources */ = {isa = PBXBuildFile; fileRef = 62FA98031BD57B6200A2AF86 /* CSSSelectors.m */; settings = {ASSET_TAGS = (); }; }; + 62FA98051BD57B6200A2AF86 /* CSSSelectors.m in Sources */ = {isa = PBXBuildFile; fileRef = 62FA98031BD57B6200A2AF86 /* CSSSelectors.m */; settings = {ASSET_TAGS = (); }; }; 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 */ @@ -352,6 +354,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 = ""; }; + 62FA98031BD57B6200A2AF86 /* CSSSelectors.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectors.m; sourceTree = ""; }; 62FC60451BD0519B0042BBE7 /* CSSSelector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelector.m; sourceTree = ""; }; /* End PBXFileReference section */ @@ -399,6 +402,7 @@ isa = PBXGroup; children = ( 624AB3151B04EA4200F3830D /* CSSSelectors.h */, + 62FA98031BD57B6200A2AF86 /* CSSSelectors.m */, 624B371C1B24E9BA0010BDDF /* CSSInputStream.h */, 624B371D1B24E9BA0010BDDF /* CSSInputStream.m */, 62F501631BC9576B0069F47B /* CSSNthExpressionParser.h */, @@ -966,6 +970,7 @@ 624493AD19CD0CBE00BCDDF4 /* HTMLToken.m in Sources */, 6235CEA11AA5170A0026937B /* HTMLMarker.m in Sources */, 623424891AB467B200726190 /* HTMLOrderedDictionary.m in Sources */, + 62FA98041BD57B6200A2AF86 /* CSSSelectors.m in Sources */, 624717BD1B22009200B38302 /* HTMLTreeWalker.m in Sources */, 62AE594019F9907C0043F069 /* HTMLTagToken.m in Sources */, 62F501661BC9576B0069F47B /* CSSNthExpressionParser.m in Sources */, diff --git a/HTMLKit/CSSSelectors.h b/HTMLKit/CSSSelectors.h index c9f9932..fa416cd 100644 --- a/HTMLKit/CSSSelectors.h +++ b/HTMLKit/CSSSelectors.h @@ -7,6 +7,60 @@ // #import "CSSSelector.h" -#import "CSSTypeSelector.h" -#import "CSSAttributeSelector.h" -#import "CSSPseudoClassSelector.h" + +NS_ASSUME_NONNULL_BEGIN + +#pragma mark - Type Selectors + +extern CSSSelector * universalSelector(); +extern CSSSelector * typeSelector(NSString *type); + +#pragma mark - Atribute Selectors + +extern CSSSelector * idSelector(NSString *elementId); +extern CSSSelector * classSelector(NSString *className); +extern CSSSelector * hasAttributeSelector(NSString *attribute); +extern CSSSelector * attributeSelector(CSSAttributeSelectorType type, + NSString *attribute, + NSString *value); + +#pragma mark - Nth-Expression Selectors + +extern CSSSelector * nthChildSelector(CSSNthExpression expression); +extern CSSSelector * nthLastChildSelector(CSSNthExpression expression); +extern CSSSelector * nthOfTypeSelector(CSSNthExpression expression); +extern CSSSelector * nthLastOfTypeSelector(CSSNthExpression expression); + +extern CSSSelector * oddSelector(); +extern CSSSelector * evenSlector(); + +extern CSSSelector * firstChildSelector(); +extern CSSSelector * lastChildSelector(); +extern CSSSelector * firstOfTypeSelector(); +extern CSSSelector * lastOfTypeSelector(); + +extern CSSSelector * onlyChildSelector(); +extern CSSSelector * onlyOfTypeSelector(); + +#pragma mark - Combinators + +extern CSSSelector * childOfElementSelector(CSSSelector *selector); +extern CSSSelector * descendantOfElementSelector(CSSSelector *selector); +extern CSSSelector * adjacentSiblingSelector(CSSSelector *selector); +extern CSSSelector * generalSiblingSelector(CSSSelector *selector); + +#pragma mark - Pseudo Functions + +extern CSSSelector * nay(CSSSelector *selector); +extern CSSSelector * has(CSSSelector *selector); + +#pragma mark - Compound Selectors + +extern CSSSelector * allOf(NSArray *selectors); +extern CSSSelector * anyOf(NSArray *selectors); + +#pragma mark - Block + +extern CSSSelector * selectorWithBlock(BOOL (^ acceptBlock)(HTMLElement *)); + +NS_ASSUME_NONNULL_END diff --git a/HTMLKit/CSSSelectors.m b/HTMLKit/CSSSelectors.m new file mode 100644 index 0000000..d88f0e7 --- /dev/null +++ b/HTMLKit/CSSSelectors.m @@ -0,0 +1,169 @@ +// +// CSSSelectors.m +// HTMLKit +// +// Created by Iska on 19/10/15. +// Copyright © 2015 BrainCookie. All rights reserved. +// + +#import "CSSSelectors.h" +#import "CSSTypeSelector.h" +#import "CSSAttributeSelector.h" +#import "CSSPseudoClassSelector.h" +#import "CSSPseudoFunctionSelector.h" +#import "CSSNthExpressionSelector.h" +#import "CSSStructuralPseudoSelector.h" +#import "CSSCombinatorSelector.h" +#import "CSSCompoundSelector.h" +#import "CSSSelectorBlock.h" + +#pragma mark - Type Selectors + +CSSSelector *universalSelector() +{ + return [CSSTypeSelector universalSelector]; +} + +CSSSelector *typeSelector(NSString *type) +{ + return [[CSSTypeSelector alloc] initWithType:type]; +} + +#pragma mark - Atribute Selectors + +CSSSelector *idSelector(NSString *elementId) +{ + return [CSSAttributeSelector idSelector:elementId]; +} + +CSSSelector *classSelector(NSString *className) +{ + return [CSSAttributeSelector classSelector:className]; +} + +CSSSelector *hasAttributeSelector(NSString *attribute) +{ + return [CSSAttributeSelector hasAttributeSelector:attribute]; +} + +CSSSelector *attributeSelector(CSSAttributeSelectorType type, + NSString *attribute, + NSString *value) +{ + return [[CSSAttributeSelector alloc] initWithType:type attributeName:attribute attrbiuteValue:value]; +} + +#pragma mark - Nth-Expression Selectors + +CSSSelector *nthChildSelector(CSSNthExpression expression) +{ + return [CSSNthExpressionSelector nthChildSelector:expression]; +} + +CSSSelector *nthLastChildSelector(CSSNthExpression expression) +{ + return [CSSNthExpressionSelector nthLastChildSelector:expression]; +} + +CSSSelector *nthOfTypeSelector(CSSNthExpression expression) +{ + return [CSSNthExpressionSelector nthOfTypeSelector:expression]; +} + +CSSSelector *nthLastOfTypeSelector(CSSNthExpression expression) +{ + return [CSSNthExpressionSelector nthLastOfTypeSelector:expression]; +} + +CSSSelector * oddSelector() +{ + return [CSSNthExpressionSelector nthChildSelector:CSSNthExpressionOdd]; +} + +CSSSelector * evenSlector() +{ + return [CSSNthExpressionSelector nthChildSelector:CSSNthExpressionEven]; +} + +CSSSelector *firstChildSelector() +{ + return [CSSNthExpressionSelector nthChildSelector:CSSNthExpressionMake(0, 1)]; +} + +CSSSelector *lastChildSelector() +{ + return [CSSNthExpressionSelector nthLastChildSelector:CSSNthExpressionMake(0, 1)]; +} + +CSSSelector *firstOfTypeSelector() +{ + return [CSSNthExpressionSelector nthOfTypeSelector:CSSNthExpressionMake(0, 1)]; +} + +CSSSelector *lastOfTypeSelector() +{ + return [CSSNthExpressionSelector nthLastOfTypeSelector:CSSNthExpressionMake(0, 1)]; +} + +CSSSelector *onlyChildSelector() +{ + return allOf(@[firstChildSelector(), lastChildSelector()]); +} + +CSSSelector *onlyOfTypeSelector() +{ + return allOf(@[firstOfTypeSelector(), lastOfTypeSelector()]); +} + +#pragma mark - Combinators + +CSSSelector *childOfElementSelector(CSSSelector *selector) +{ + return [CSSCombinatorSelector childOfElementCombinator:selector]; +} + +CSSSelector *descendantOfElementSelector(CSSSelector *selector) +{ + return [CSSCombinatorSelector descendantOfElementCombinator:selector]; +} + +CSSSelector *adjacentSiblingSelector(CSSSelector *selector) +{ + return [CSSCombinatorSelector adjacentSiblingCombinator:selector]; +} + +CSSSelector *generalSiblingSelector(CSSSelector *selector) +{ + return [CSSCombinatorSelector generalSiblingCombinator:selector]; +} + +#pragma mark - Pseudo Functions + +CSSSelector *nay(CSSSelector *selector) +{ + return [CSSPseudoFunctionSelector notSelector:selector]; +} + +CSSSelector *has(CSSSelector *selector) +{ + return [CSSPseudoFunctionSelector hasSelector:selector]; +} + +#pragma mark - Compound Selectors + +CSSSelector *allOf( NSArray * selectors) +{ + return [CSSCompoundSelector andSelector:selectors]; +} + +CSSSelector *anyOf( NSArray * selectors) +{ + return [CSSCompoundSelector andSelector:selectors]; +} + +#pragma mark - Block + +CSSSelector * selectorWithBlock(BOOL (^ acceptBlock)(HTMLElement *)) +{ + return nil; +}