diff --git a/Sources/HTMLRange.m b/Sources/HTMLRange.m index 1617584..15f30c7 100644 --- a/Sources/HTMLRange.m +++ b/Sources/HTMLRange.m @@ -273,6 +273,34 @@ NS_INLINE NSComparisonResult CompareBoundaries(HTMLNode *startNode, NSUInteger s return NO; } +- (BOOL)containsNode:(HTMLNode *)node +{ + return CompareBoundaries(_startContainer, _startOffset, node, 0) == NSOrderedAscending && + CompareBoundaries(_endContainer, _endOffset, node, node.length) == NSOrderedDescending; +} + +- (BOOL)partiallyContainsNode:(HTMLNode *)node +{ + return [GetAncestorNodes(_startContainer) containsObject:node] || [GetAncestorNodes(_endContainer) containsObject:node]; +} + +- (NSArray *)containedNodes +{ + HTMLNode *commonAncestor = self.commonAncestorContainer; + + NSMutableArray *containedNodes = [NSMutableArray array]; + [commonAncestor.childNodes enumerateObjectsUsingBlock:^(HTMLNode * _Nonnull node, NSUInteger idx, BOOL * _Nonnull stop) { + if (node.nodeType == HTMLNodeDocumentType) { + [NSException raise:HTMLKitHierarchyRequestError format:@"Hierarchy Request Error, encountered a DOCTYPE contained in range: %@", self]; + } + if ([self containsNode:node]) { + [containedNodes addObject:node]; + } + }]; + + return containedNodes; +} + #pragma mark - Update Callbacks - (void)didRemoveCharacterDataInNode:(HTMLCharacterData *)node atOffset:(NSUInteger)offset withLength:(NSUInteger)length