Skip to content

Commit

Permalink
Consider namespace while in "in cell" insertion mode.
Browse files Browse the repository at this point in the history
  • Loading branch information
nolanw committed Jul 3, 2016
1 parent 33739e4 commit 338e485
Showing 1 changed file with 31 additions and 4 deletions.
35 changes: 31 additions & 4 deletions Sources/HTMLParser.m
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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 ]
Expand Down

0 comments on commit 338e485

Please sign in to comment.