Add HTML Range stringifier and description
https://dom.spec.whatwg.org/#dom-range-stringifier
This commit is contained in:
@@ -240,6 +240,13 @@ typedef NS_ENUM(unsigned short, HTMLRangeComparisonMethod)
|
||||
*/
|
||||
- (void)surroundContents:(HTMLNode *)newParent;
|
||||
|
||||
/**
|
||||
The stringifier of the range.
|
||||
|
||||
@return The text contents of the range.
|
||||
*/
|
||||
- (NSString *)textContent;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
@@ -710,4 +710,44 @@ NS_INLINE void CheckValidSurroundNodeType(HTMLNode *node, NSString *cmd)
|
||||
[self selectNode:newParent];
|
||||
}
|
||||
|
||||
#pragma mark - Description & Stringifier
|
||||
|
||||
- (NSString *)description
|
||||
{
|
||||
return [NSString stringWithFormat:@"<%@: %p (%@, %lu), (%@, %lu)>", self.class, self,
|
||||
_startContainer, (unsigned long)_startOffset,
|
||||
_endContainer, (unsigned long)_endOffset];
|
||||
}
|
||||
|
||||
- (NSString *)textContent
|
||||
{
|
||||
HTMLNode *lastNode = nil;
|
||||
if ([_endContainer isKindOfClass:[HTMLCharacterData class]]) {
|
||||
lastNode = FollowingNodeSkippingChildren(_endContainer, _ownerDocument);
|
||||
} else if (_endContainer.childNodesCount > _endOffset) {
|
||||
lastNode = [_endContainer childNodeAtIndex:_endOffset];
|
||||
} else {
|
||||
lastNode = FollowingNodeSkippingChildren(_endContainer, _ownerDocument);
|
||||
}
|
||||
|
||||
NSMutableString *content = [NSMutableString string];
|
||||
for (HTMLNode *node = _startContainer; node != lastNode; node = FollowingNode(node, _ownerDocument)) {
|
||||
if (node.nodeType == HTMLNodeText) {
|
||||
HTMLText *text = (HTMLText *)node;
|
||||
|
||||
if (node == _startContainer) {
|
||||
NSString *string = [text substringDataWithRange:NSMakeRange(_startOffset, _startContainer.length - _startOffset)];
|
||||
[content appendString:string];
|
||||
} else if (node == _endContainer) {
|
||||
NSString *string = [text substringDataWithRange:NSMakeRange(0, _endOffset)];
|
||||
[content appendString:string];
|
||||
} else {
|
||||
[content appendString:text.data];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -1949,4 +1949,48 @@
|
||||
@"</div>"));
|
||||
}
|
||||
|
||||
#pragma mark - Stringifier
|
||||
|
||||
- (void)testRangeStringifier
|
||||
{
|
||||
HTMLDocument *document = self.editingDocument;
|
||||
HTMLRange *range = [[HTMLRange alloc] initWithDowcument:document];
|
||||
|
||||
HTMLNode *start = [document querySelector:@"#P1"].firstChild;
|
||||
[range setStartNode:start startOffset:2];
|
||||
HTMLNode *end = [document querySelector:@"#P1"].lastChild;
|
||||
[range setEndNode:end endOffset:3];
|
||||
XCTAssertEqualObjects([range textContent], @"is is a te");
|
||||
|
||||
start = [document querySelector:@"#P1"];
|
||||
[range setStartNode:start startOffset:0];
|
||||
end = [document querySelector:@"#P1"];
|
||||
[range setEndNode:end endOffset:2];
|
||||
XCTAssertEqualObjects([range textContent], @"This is a");
|
||||
|
||||
start = [document querySelector:@"#D1"];
|
||||
[range setStartNode:start startOffset:0];
|
||||
end = [document querySelector:@"#D1"];
|
||||
[range setEndNode:end endOffset:1];
|
||||
XCTAssertEqualObjects([range textContent], @"This is a text");
|
||||
|
||||
start = [document querySelector:@"#D1"];
|
||||
[range setStartNode:start startOffset:0];
|
||||
end = [document querySelector:@"#D1"];
|
||||
[range setEndNode:end endOffset:2];
|
||||
XCTAssertEqualObjects([range textContent], @"This is a textHello");
|
||||
|
||||
start = [document querySelector:@"#D1"];
|
||||
[range setStartNode:start startOffset:0];
|
||||
end = [document querySelector:@"#D2"];
|
||||
[range setEndNode:end endOffset:0];
|
||||
XCTAssertEqualObjects([range textContent], @"This is a textHelloWorld");
|
||||
|
||||
start = [document querySelector:@"#D1"];
|
||||
[range setStartNode:start startOffset:0];
|
||||
end = [document querySelector:@"#D2"];
|
||||
[range setEndNode:end endOffset:1];
|
||||
XCTAssertEqualObjects([range textContent], @"This is a textHelloWorldAnother text");
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
Reference in New Issue
Block a user