diff --git a/HTMLKit/HTMLNode.h b/HTMLKit/HTMLNode.h
index ac4a20c..a488dcd 100644
--- a/HTMLKit/HTMLNode.h
+++ b/HTMLKit/HTMLNode.h
@@ -119,7 +119,7 @@ typedef NS_ENUM(unsigned short, HTMLDocumentPosition)
- (HTMLNodeIterator *)nodeIteratorWithShowOptions:(HTMLNodeFilterShowOptions)showOptions
filter:(id)filter;
- (HTMLNodeIterator *)nodeIteratorWithShowOptions:(HTMLNodeFilterShowOptions)showOptions
- filterBlock:(BOOL (^)(HTMLNode *node))filter;
+ filterBlock:(HTMLNodeFilterValue (^)(HTMLNode *node))filter;
- (NSString *)treeDescription;
diff --git a/HTMLKit/HTMLNode.m b/HTMLKit/HTMLNode.m
index 6f4a221..f6cedbc 100644
--- a/HTMLKit/HTMLNode.m
+++ b/HTMLKit/HTMLNode.m
@@ -381,7 +381,7 @@
}
- (HTMLNodeIterator *)nodeIteratorWithShowOptions:(HTMLNodeFilterShowOptions)showOptions
- filterBlock:(BOOL (^)(HTMLNode *node))filter
+ filterBlock:(HTMLNodeFilterValue (^)(HTMLNode *node))filter
{
return [HTMLNodeIterator iteratorWithNode:self showOptions:showOptions filter:filter];
}
diff --git a/HTMLKit/HTMLNodeFilter.h b/HTMLKit/HTMLNodeFilter.h
index 84c4c57..9df0e74 100644
--- a/HTMLKit/HTMLNodeFilter.h
+++ b/HTMLKit/HTMLNodeFilter.h
@@ -8,6 +8,13 @@
#import
+typedef NS_ENUM(unsigned short, HTMLNodeFilterValue)
+{
+ HTMLNodeFilterAccept = 1,
+ HTMLNodeFilterReject = 2,
+ HTMLNodeFilterSkip = 3
+};
+
typedef NS_ENUM(unsigned long, HTMLNodeFilterShowOptions)
{
HTMLNodeFilterShowAll = 0xFFFFFFFF,
@@ -23,12 +30,12 @@ typedef NS_ENUM(unsigned long, HTMLNodeFilterShowOptions)
@protocol HTMLNodeFilter
-- (BOOL)acceptNode:(HTMLNode *)node;
+- (HTMLNodeFilterValue)acceptNode:(HTMLNode *)node;
@end
@interface HTMLNodeFilterBlock : NSObject
-+ (instancetype)filterWithBlock:(BOOL (^)(HTMLNode *node))block;
++ (instancetype)filterWithBlock:(HTMLNodeFilterValue (^)(HTMLNode *node))block;
-@end
\ No newline at end of file
+@end
diff --git a/HTMLKit/HTMLNodeFilter.m b/HTMLKit/HTMLNodeFilter.m
index 914ee72..96e4843 100644
--- a/HTMLKit/HTMLNodeFilter.m
+++ b/HTMLKit/HTMLNodeFilter.m
@@ -16,12 +16,12 @@
@implementation HTMLNodeFilterBlock
-+ (instancetype)filterWithBlock:(BOOL (^)(HTMLNode *))block
++ (instancetype)filterWithBlock:(HTMLNodeFilterValue (^)(HTMLNode *))block
{
return [[self alloc] initWithBlock:block];
}
-- (instancetype)initWithBlock:(BOOL (^)(HTMLNode *))block
+- (instancetype)initWithBlock:(HTMLNodeFilterValue (^)(HTMLNode *))block
{
self = [super init];
if (self) {
@@ -30,10 +30,10 @@
return self;
}
-- (BOOL)acceptNode:(HTMLNode *)node
+- (HTMLNodeFilterValue)acceptNode:(HTMLNode *)node
{
if (!_block) {
- return NO;
+ return HTMLNodeFilterSkip;
}
return _block(node);
diff --git a/HTMLKit/HTMLNodeIterator.h b/HTMLKit/HTMLNodeIterator.h
index 803f55e..6dd269e 100644
--- a/HTMLKit/HTMLNodeIterator.h
+++ b/HTMLKit/HTMLNodeIterator.h
@@ -21,7 +21,7 @@
+ (instancetype)iteratorWithNode:(HTMLNode *)node
showOptions:(HTMLNodeFilterShowOptions)showOptions
- filter:(BOOL (^)(HTMLNode *node))filter;
+ filter:(HTMLNodeFilterValue (^)(HTMLNode *node))filter;
- (instancetype)initWithNode:(HTMLNode *)node;
- (instancetype)initWithNode:(HTMLNode *)node
diff --git a/HTMLKit/HTMLNodeIterator.m b/HTMLKit/HTMLNodeIterator.m
index 2927ac0..c5e85d1 100644
--- a/HTMLKit/HTMLNodeIterator.m
+++ b/HTMLKit/HTMLNodeIterator.m
@@ -35,7 +35,7 @@ typedef NS_ENUM(short, TraverseDirection)
+ (instancetype)iteratorWithNode:(HTMLNode *)node
showOptions:(HTMLNodeFilterShowOptions)showOptions
- filter:(BOOL (^)(HTMLNode *))filter
+ filter:(HTMLNodeFilterValue (^)(HTMLNode *))filter
{
return [[self alloc] initWithNode:node
showOptions:showOptions
@@ -139,7 +139,7 @@ typedef NS_ENUM(short, TraverseDirection)
}
beforeNode = YES;
}
- } while (!FilterNode(self.filter, self.whatToShow, node));
+ } while (FilterNode(self.filter, self.whatToShow, node) != HTMLNodeFilterAccept);
_referenceNode = node;
_pointerBeforeReferenceNode = beforeNode;
diff --git a/HTMLKit/HTMLNodeTraversal.h b/HTMLKit/HTMLNodeTraversal.h
index 610700f..ee2bf7e 100644
--- a/HTMLKit/HTMLNodeTraversal.h
+++ b/HTMLKit/HTMLNodeTraversal.h
@@ -14,4 +14,4 @@
extern HTMLNode * PrecedingNode(HTMLNode *node, HTMLNode *root);
extern HTMLNode * FollowingNode(HTMLNode *node, HTMLNode *root);
extern HTMLNode * FollowingNodeSkippingChildren(HTMLNode *node, HTMLNode *root);
-extern BOOL FilterNode(id filter, HTMLNodeFilterShowOptions whatToShow, HTMLNode *node);
+extern HTMLNodeFilterValue FilterNode(id filter, HTMLNodeFilterShowOptions whatToShow, HTMLNode *node);
diff --git a/HTMLKit/HTMLNodeTraversal.m b/HTMLKit/HTMLNodeTraversal.m
index 1ef2de8..1c646df 100644
--- a/HTMLKit/HTMLNodeTraversal.m
+++ b/HTMLKit/HTMLNodeTraversal.m
@@ -61,15 +61,15 @@ HTMLNode * FollowingNodeSkippingChildren(HTMLNode *node, HTMLNode *root)
return nil;
}
-BOOL FilterNode(id filter, HTMLNodeFilterShowOptions whatToShow, HTMLNode *node)
+HTMLNodeFilterValue FilterNode(id filter, HTMLNodeFilterShowOptions whatToShow, HTMLNode *node)
{
unsigned long nthBit = (1 << (node.nodeType - 1)) & whatToShow;
if (!nthBit) {
- return NO;
+ return HTMLNodeFilterSkip;
}
if (filter == nil) {
- return YES;
+ return HTMLNodeFilterAccept;
}
return [filter acceptNode:node];
diff --git a/HTMLKit/HTMLTreeWalker.m b/HTMLKit/HTMLTreeWalker.m
index d4a90c5..b76c119 100644
--- a/HTMLKit/HTMLTreeWalker.m
+++ b/HTMLKit/HTMLTreeWalker.m
@@ -43,6 +43,20 @@ typedef NS_ENUM(short, HTMLTreeWalkerSiblingsType)
#pragma mark - Traversal
+- (HTMLNode *)parentNode
+{
+ HTMLNode *node = _currentNode;
+
+ while (node != nil && node != _root) {
+ node = node.parentNode;
+ if (node != nil && FilterNode(self.filter, self.whatToShow, node) == HTMLNodeFilterAccept) {
+ _currentNode = node;
+ return node;
+ }
+ }
+ return nil;
+}
+
- (HTMLNode *)traverseChildrenOfType:(HTMLTreeWalkerChildrenType)type
{
HTMLNode *node = _currentNode;
@@ -50,16 +64,18 @@ typedef NS_ENUM(short, HTMLTreeWalkerSiblingsType)
node = (type == HTMLTreeWalkerChildrenTypeFirst) ? node.firstChiledNode : node.lastChildNode;
while (node != nil) {
- BOOL result = FilterNode(self.filter, self.whatToShow, node);
- if (result) {
+ HTMLNodeFilterValue result = FilterNode(self.filter, self.whatToShow, node);
+ if (result == HTMLNodeFilterAccept) {
_currentNode = node;
return node;
}
- HTMLNode *child = (type == HTMLTreeWalkerChildrenTypeFirst) ? node.firstChiledNode : node.lastChildNode;
- if (child != nil) {
- node = child;
- continue;
+ if (result == HTMLNodeFilterSkip) {
+ HTMLNode *child = (type == HTMLTreeWalkerChildrenTypeFirst) ? node.firstChiledNode : node.lastChildNode;
+ if (child != nil) {
+ node = child;
+ continue;
+ }
}
while (node != nil) {
@@ -80,20 +96,6 @@ typedef NS_ENUM(short, HTMLTreeWalkerSiblingsType)
return nil;
}
-- (HTMLNode *)parentNode
-{
- HTMLNode *node = _currentNode;
-
- while (node != nil && node != _root) {
- node = node.parentNode;
- if (node != nil && FilterNode(self.filter, self.whatToShow, node)) {
- _currentNode = node;
- return node;
- }
- }
- return nil;
-}
-
- (HTMLNode *)firstChild
{
return [self traverseChildrenOfType:HTMLTreeWalkerChildrenTypeFirst];
@@ -116,8 +118,8 @@ typedef NS_ENUM(short, HTMLTreeWalkerSiblingsType)
HTMLNode *sibling = (type == HTMLTreeWalkerSiblingsTypeNext) ? node.nextSibling : node.previousSibling;
while (sibling != nil) {
node = sibling;
- BOOL result = FilterNode(self.filter, self.whatToShow, node);
- if (result) {
+ HTMLNodeFilterValue result = FilterNode(self.filter, self.whatToShow, node);
+ if (result == HTMLNodeFilterAccept) {
_currentNode = node;
return node;
}
@@ -133,10 +135,11 @@ typedef NS_ENUM(short, HTMLTreeWalkerSiblingsType)
return nil;
}
- if (FilterNode(self.filter, self.whatToShow, node)) {
+ if (FilterNode(self.filter, self.whatToShow, node) == HTMLNodeFilterAccept) {
return nil;
}
}
+
return nil;
}
@@ -160,13 +163,13 @@ typedef NS_ENUM(short, HTMLTreeWalkerSiblingsType)
while (sibling != nil) {
node = sibling;
- BOOL result = FilterNode(self.filter, self.whatToShow, node);
- while (result && node.hasChildNodes) {
+ HTMLNodeFilterValue result = FilterNode(self.filter, self.whatToShow, node);
+ while (result != HTMLNodeFilterReject && node.hasChildNodes) {
node = node.lastChildNode;
result = FilterNode(self.filter, self.whatToShow, node);
}
- if (result) {
+ if (result == HTMLNodeFilterAccept) {
_currentNode = node;
return node;
}
@@ -179,7 +182,7 @@ typedef NS_ENUM(short, HTMLTreeWalkerSiblingsType)
}
node = node.parentNode;
- if (FilterNode(self.filter, self.whatToShow, node)) {
+ if (FilterNode(self.filter, self.whatToShow, node) == HTMLNodeFilterAccept) {
_currentNode = node;
return node;
}
@@ -192,13 +195,13 @@ typedef NS_ENUM(short, HTMLTreeWalkerSiblingsType)
{
HTMLNode *node = _currentNode;
- BOOL result = YES;
+ HTMLNodeFilterValue result = YES;
while (YES) {
- while (!result && node.hasChildNodes) {
+ while (result != HTMLNodeFilterReject && node.hasChildNodes) {
node = node.firstChiledNode;
result = FilterNode(self.filter, self.whatToShow, node);
- if (result) {
+ if (result == HTMLNodeFilterAccept) {
_currentNode = node;
return node;
}
@@ -208,7 +211,7 @@ typedef NS_ENUM(short, HTMLTreeWalkerSiblingsType)
while ((nextSibling = FollowingNodeSkippingChildren(node, _root)) != nil) {
node = nextSibling;
result = FilterNode(self.filter, self.whatToShow, node);
- if (result) {
+ if (result == HTMLNodeFilterAccept) {
_currentNode = node;
return node;
}
diff --git a/HTMLKitTests/HTMLKitNodeIteratorTests.m b/HTMLKitTests/HTMLKitNodeIteratorTests.m
index a6411f3..118b5c6 100644
--- a/HTMLKitTests/HTMLKitNodeIteratorTests.m
+++ b/HTMLKitTests/HTMLKitNodeIteratorTests.m
@@ -310,13 +310,14 @@
{
HTMLDocument *document = self.mixedTree;
- HTMLNodeIterator *iterator = [document nodeIteratorWithShowOptions:HTMLNodeFilterShowAll filterBlock:^BOOL(HTMLNode *node) {
+ HTMLNodeIterator *iterator = [document nodeIteratorWithShowOptions:HTMLNodeFilterShowAll
+ filterBlock:^HTMLNodeFilterValue(HTMLNode *node) {
if (node.nodeType == HTMLNodeComment) {
if ([[(HTMLComment *)node data] rangeOfString:@"second"].location != NSNotFound) {
- return YES;
+ return HTMLNodeFilterAccept;
}
}
- return NO;
+ return HTMLNodeFilterSkip;
}];
NSArray *result = iterator.allObjects;