diff --git a/HTMLKit/HTMLParser.m b/HTMLKit/HTMLParser.m index 259568b..697148f 100644 --- a/HTMLKit/HTMLParser.m +++ b/HTMLKit/HTMLParser.m @@ -480,6 +480,69 @@ } } +- (HTMLElement *)hasElementWithTagNameInSpecificScope:(NSString *)tagName + withAdditionalTypes:(NSDictionary *)additional +{ + NSMutableDictionary *elementTypes = [NSMutableDictionary dictionaryWithDictionary:additional]; + [elementTypes addEntriesFromDictionary:@{ + @"applet": @(HTMLNamespaceHTML), + @"caption": @(HTMLNamespaceHTML), + @"html": @(HTMLNamespaceHTML), + @"table": @(HTMLNamespaceHTML), + @"td": @(HTMLNamespaceHTML), + @"th": @(HTMLNamespaceHTML), + @"marquee": @(HTMLNamespaceHTML), + @"object": @(HTMLNamespaceHTML), + @"template": @(HTMLNamespaceHTML), + @"mi": @(HTMLNamespaceMathML), + @"mo": @(HTMLNamespaceMathML), + @"mn": @(HTMLNamespaceMathML), + @"ms": @(HTMLNamespaceMathML), + @"mtext": @(HTMLNamespaceMathML), + @"annotation-xml": @(HTMLNamespaceMathML), + @"foreignObject": @(HTMLNamespaceSVG), + @"desc": @(HTMLNamespaceSVG), + @"title": @(HTMLNamespaceSVG) + }]; + + for (HTMLElement *node in _stackOfOpenElements.reverseObjectEnumerator) { + if ([node.tagName isEqualToString:tagName]) { + return node; + } + if ([elementTypes[node.tagName] isEqual:@(node.namespace)]) { + return nil; + } + } + return nil; +} + +- (HTMLElement *)hasElementWithTagNameInButtonScope:(NSString *)tagName +{ + return [self hasElementWithTagNameInSpecificScope:tagName + withAdditionalTypes:@{@"ol": @(HTMLNamespaceHTML), + @"ul": @(HTMLNamespaceHTML)}]; +} + +- (HTMLElement *)hasElementWithTagNameInListScope:(NSString *)tagName +{ + return [self hasElementWithTagNameInSpecificScope:tagName + withAdditionalTypes:@{@"button": @(HTMLNamespaceHTML)}]; +} + +- (HTMLElement *)hasElementWithTagNameInTableScope:(NSString *)tagName +{ + return [self hasElementWithTagNameInSpecificScope:tagName + withAdditionalTypes:@{@"html": @(HTMLNamespaceHTML), + @"table": @(HTMLNamespaceHTML), + @"template": @(HTMLNamespaceHTML)}]; +} + +- (HTMLElement *)hasElementWithTagNameInSelectScope:(NSString *)tagName +{ + return [self hasElementWithTagNameInSpecificScope:tagName + withAdditionalTypes:@{@"optgroup": @(HTMLNamespaceHTML), + @"option": @(HTMLNamespaceHTML)}]; +} #pragma mark - Insertion Modes - (void)HTMLInsertionModeInitial:(HTMLToken *)token