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