diff --git a/Sources/HTMLParser.m b/Sources/HTMLParser.m index 5c95a05..aa13ecf 100644 --- a/Sources/HTMLParser.m +++ b/Sources/HTMLParser.m @@ -1700,24 +1700,29 @@ - (void)inCellInsertionModeHandleStartTagToken:(HTMLStartTagToken *)token - (void)inCellInsertionModeHandleEndTagToken:(HTMLEndTagToken *)token { if (StringIsEqualToAnyOf(token.tagName, @"td", @"th")) { - if (![self elementInTableScopeWithTagName:token.tagName]) { + if (![self elementInTableScopeWithTagName:token.tagName namespace:HTMLNamespaceHTML]) { [self addParseError:@"End tag '%@' outside cell in cell", token.tagName]; return; } + [self generateImpliedEndTags]; - if (![self.currentNode.tagName isEqualToString:token.tagName]) { + + if (!(self.currentNode.htmlNamespace == HTMLNamespaceHTML && [self.currentNode.tagName isEqualToString:token.tagName])) { [self addParseError:@"Misnested end tag '%@' in cell", token.tagName]; } - while (![self.currentNode.tagName isEqualToString:token.tagName]) { + + while (!(self.currentNode.htmlNamespace == HTMLNamespaceHTML && [self.currentNode.tagName isEqualToString:token.tagName])) { [_stackOfOpenElements removeLastObject]; } [_stackOfOpenElements removeLastObject]; + [self clearActiveFormattingElementsUpToLastMarker]; + [self switchInsertionMode:HTMLInRowInsertionMode]; } else if (StringIsEqualToAnyOf(token.tagName, @"body", @"caption", @"col", @"colgroup", @"html")) { [self addParseError:@"End tag '%@' in cell", token.tagName]; } else if (StringIsEqualToAnyOf(token.tagName, @"table", @"tbody", @"tfoot", @"thead", @"tr")) { - if (![self elementInTableScopeWithTagName:token.tagName]) { + if (![self elementInTableScopeWithTagName:token.tagName namespace:HTMLNamespaceHTML]) { [self addParseError:@"End tag '%@' for unknown element in cell", token.tagName]; return; } @@ -2854,17 +2859,39 @@ - (HTMLElement *)elementInSpecificScopeWithTagNameInArray:(NSArray *)tagNames return nil; } +- (HTMLElement *)elementInSpecificScopeWithTagNameInArray:(NSArray *)tagNames + elementTypes:(NSDictionary *)elementTypes + namespace:(HTMLNamespace)namespace +{ + for (HTMLElement *node in _stackOfOpenElements.reverseObjectEnumerator) { + if (node.htmlNamespace == namespace && [tagNames containsObject:node.tagName]) return node; + if ([elementTypes[@(node.htmlNamespace)] containsObject:node.tagName]) return nil; + } + return nil; +} + - (HTMLElement *)elementInTableScopeWithTagName:(NSString *)tagName { return [self elementInTableScopeWithTagNameInArray:@[ tagName ]]; } +- (HTMLElement *)elementInTableScopeWithTagName:(NSString *)tagName namespace:(HTMLNamespace)namespace +{ + return [self elementInTableScopeWithTagNameInArray:@[ tagName ] namespace:namespace]; +} + - (HTMLElement *)elementInTableScopeWithTagNameInArray:(NSArray *)tagNames { NSDictionary *elementTypes = @{ @(HTMLNamespaceHTML): @[ @"html", @"table" ] }; return [self elementInSpecificScopeWithTagNameInArray:tagNames elementTypes:elementTypes]; } +- (HTMLElement *)elementInTableScopeWithTagNameInArray:(NSArray *)tagNames namespace:(HTMLNamespace)namespace +{ + NSDictionary *elementTypes = @{ @(HTMLNamespaceHTML): @[ @"html", @"table" ] }; + return [self elementInSpecificScopeWithTagNameInArray:tagNames elementTypes:elementTypes namespace:namespace]; +} + - (HTMLElement *)elementInListItemScopeWithTagName:(NSString *)tagName { return [self elementInScopeWithTagNameInArray:@[ tagName ]