From c9996a55d05443a8d956885454b133a01ae13329 Mon Sep 17 00:00:00 2001 From: Nolan Waite Date: Sun, 3 Jul 2016 01:59:28 -0300 Subject: [PATCH] Update and handling. --- Sources/HTMLParser.m | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/Sources/HTMLParser.m b/Sources/HTMLParser.m index 9dbac4f..5c95a05 100644 --- a/Sources/HTMLParser.m +++ b/Sources/HTMLParser.m @@ -692,10 +692,20 @@ - (void)inBodyInsertionModeHandleStartTagToken:(HTMLStartTagToken *)token } [self insertElementForToken:token]; [self switchInsertionMode:HTMLInFramesetInsertionMode]; - } else if (StringIsEqualToAnyOf(token.tagName, @"address", @"article", @"aside", @"blockquote", @"center", @"details", @"dialog", @"dir", @"div", @"dl", @"fieldset", @"figcaption", @"figure", @"footer", @"header", @"hgroup", @"main", @"menu", @"nav", @"ol", @"p", @"section", @"summary", @"ul")) { + } else if (StringIsEqualToAnyOf(token.tagName, @"address", @"article", @"aside", @"blockquote", @"center", @"details", @"dialog", @"dir", @"div", @"dl", @"fieldset", @"figcaption", @"figure", @"footer", @"header", @"hgroup", @"main", @"nav", @"ol", @"p", @"section", @"summary", @"ul")) { if ([self elementInButtonScopeWithTagName:@"p"]) { [self closePElement]; } + [self insertElementForToken:token]; + } else if ([token.tagName isEqualToString:@"menu"]) { + if ([self elementInButtonScopeWithTagName:@"p"]) { + [self closePElement]; + } + + if ([self.currentNode.tagName isEqualToString:@"menuitem"]) { + [_stackOfOpenElements removeObject:self.currentNode]; + } + [self insertElementForToken:token]; } else if (StringIsEqualToAnyOf(token.tagName, @"h1", @"h2", @"h3", @"h4", @"h5", @"h6")) { if ([self elementInButtonScopeWithTagName:@"p"]) { @@ -725,28 +735,37 @@ - (void)inBodyInsertionModeHandleStartTagToken:(HTMLStartTagToken *)token _formElementPointer = form; } else if ([token.tagName isEqualToString:@"li"]) { _framesetOkFlag = NO; + HTMLElement *node = self.currentNode; + loop: if ([node.tagName isEqualToString:@"li"]) { [self generateImpliedEndTagsExceptForTagsNamed:@"li"]; + if (![self.currentNode.tagName isEqualToString:@"li"]) { [self addParseError:@"Misnested li tag in "]; } + while (![self.currentNode.tagName isEqualToString:@"li"]) { [_stackOfOpenElements removeLastObject]; } [_stackOfOpenElements removeLastObject]; + goto done; } + if (IsSpecialElement(node) && !(node.htmlNamespace == HTMLNamespaceHTML && StringIsEqualToAnyOf(node.tagName, @"address", @"div", @"p"))) { goto done; } + node = [_stackOfOpenElements objectAtIndex:[_stackOfOpenElements indexOfObject:node] - 1]; goto loop; + done: if ([self elementInButtonScopeWithTagName:@"p"]) { [self closePElement]; } + [self insertElementForToken:token]; } else if ([token.tagName isEqualToString:@"dd"] || [token.tagName isEqualToString:@"dt"]) { _framesetOkFlag = NO; @@ -855,15 +874,21 @@ - (void)inBodyInsertionModeHandleStartTagToken:(HTMLStartTagToken *)token if (!type || [type caseInsensitiveCompare:@"hidden"] != NSOrderedSame) { _framesetOkFlag = NO; } - } else if (StringIsEqualToAnyOf(token.tagName, @"menuitem", @"param", @"source", @"track")) { + } else if (StringIsEqualToAnyOf(token.tagName, @"param", @"source", @"track")) { [self insertElementForToken:token]; [_stackOfOpenElements removeLastObject]; } else if ([token.tagName isEqualToString:@"hr"]) { if ([self elementInButtonScopeWithTagName:@"p"]) { [self closePElement]; } + + if ([self.currentNode.tagName isEqualToString:@"menuitem"]) { + [_stackOfOpenElements removeObject:self.currentNode]; + } + [self insertElementForToken:token]; [_stackOfOpenElements removeLastObject]; + _framesetOkFlag = NO; } else if ([token.tagName isEqualToString:@"image"]) { [self addParseError:@"It's spelled 'img' in "]; @@ -907,6 +932,15 @@ - (void)inBodyInsertionModeHandleStartTagToken:(HTMLStartTagToken *)token [_stackOfOpenElements removeLastObject]; } [self reconstructTheActiveFormattingElements]; + [self insertElementForToken:token]; + } else if ([token.tagName isEqualToString:@"menuitem"]) { + if ([self.currentNode.tagName isEqualToString:@"menuitem"]) { + [_stackOfOpenElements removeObject:self.currentNode]; + } + + // SPEC: Missing as of 2016-Jul-03 but tests and nearby commentary suggest its presence in order to act like