Files
HTMLKit/HTMLKit/HTMLNodeTreeEnumerator.m
T
iska 83c9841122 Add implementation for HTML Node Tree Enumerator
Tree-Order (pre-order) enumeration for HTML Node and its descendants
2015-03-29 00:00:01 +01:00

55 lines
1.1 KiB
Objective-C

//
// HTMLNodeTreeEnumerator.m
// HTMLKit
//
// Created by Iska on 28/03/15.
// Copyright (c) 2015 BrainCookie. All rights reserved.
//
#import "HTMLNodeTreeEnumerator.h"
#import "HTMLNode.h"
@interface HTMLNodeTreeEnumerator ()
{
BOOL _reverse;
NSMutableArray *_stack;
}
@end
@implementation HTMLNodeTreeEnumerator
- (instancetype)initWithNode:(HTMLNode *)node reverse:(BOOL)reverse
{
self = [super init];
if (self) {
_reverse = reverse;
_stack = [[NSMutableArray alloc] initWithObjects:node, nil];
}
return self;
}
- (id)nextObject
{
if (_stack.count == 0) {
return nil;
}
HTMLNode *node = _stack.lastObject;
[_stack removeLastObject];
NSArray *childNodes = node.childNodes.array;
if (childNodes != nil && childNodes.count > 0) {
if (childNodes.count > 1) {
NSRange range = NSMakeRange(_reverse ? 0 : 1, childNodes.count - 1);
NSArray *rest = [childNodes subarrayWithRange:range];
[_stack addObjectsFromArray:_reverse ? rest : rest.reverseObjectEnumerator.allObjects];
}
[_stack addObject:_reverse ? childNodes.lastObject : childNodes.firstObject];
}
return node;
}
@end