diff --git a/HTMLKit/HTMLNodeFilter.h b/HTMLKit/HTMLNodeFilter.h
index a32a2ea..3046762 100644
--- a/HTMLKit/HTMLNodeFilter.h
+++ b/HTMLKit/HTMLNodeFilter.h
@@ -26,6 +26,9 @@ typedef NS_OPTIONS(unsigned long, HTMLNodeFilterShowOptions)
HTMLNodeFilterShowDocumentFragment = 0x400
};
+
+#pragma mark - Node Filter
+
@class HTMLNode;
@protocol HTMLNodeFilter
@@ -34,8 +37,20 @@ typedef NS_OPTIONS(unsigned long, HTMLNodeFilterShowOptions)
@end
+#pragma mark - Block Filter
+
@interface HTMLNodeFilterBlock : NSObject
+ (instancetype)filterWithBlock:(HTMLNodeFilterValue (^)(HTMLNode *node))block;
@end
+
+#pragma mark - CSS Selector Filter
+
+@class CSSSelector;
+
+@interface HTMLSelectorNodeFilter : NSObject
+
++ (instancetype)filterWithSelector:(CSSSelector *)selector;
+
+@end
diff --git a/HTMLKit/HTMLNodeFilter.m b/HTMLKit/HTMLNodeFilter.m
index 96e4843..a1e0d2b 100644
--- a/HTMLKit/HTMLNodeFilter.m
+++ b/HTMLKit/HTMLNodeFilter.m
@@ -7,6 +7,10 @@
//
#import "HTMLNodeFilter.h"
+#import "HTMLNode.h"
+#import "CSSSelector.h"
+
+#pragma mark - Block Filter
@interface HTMLNodeFilterBlock ()
{
@@ -40,3 +44,42 @@
}
@end
+
+#pragma mark - CSS Selector Filter
+
+@interface HTMLSelectorNodeFilter ()
+{
+ CSSSelector *_selector;
+}
+@end
+
+@implementation HTMLSelectorNodeFilter
+
++ (instancetype)filterWithSelector:(CSSSelector *)selector
+{
+ return [[self alloc] initWithSelector:selector];
+}
+
+- (instancetype)initWithSelector:(CSSSelector *)selector
+{
+ self = [super init];
+ if (self) {
+ _selector = selector;
+ }
+ return self;
+}
+
+- (HTMLNodeFilterValue)acceptNode:(HTMLNode *)node
+{
+ if (node.nodeType != HTMLNodeElement) {
+ return HTMLNodeFilterSkip;
+ }
+
+ if ([_selector acceptElement:node.asElement]) {
+ return HTMLNodeFilterAccept;
+ }
+
+ return HTMLNodeFilterSkip;
+}
+
+@end