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;
+}