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;