From dabf24fa1c6a5463d657fcbd9ec73d40e167e7f2 Mon Sep 17 00:00:00 2001 From: iska Date: Sun, 5 Apr 2015 18:00:20 +0200 Subject: [PATCH] Change block-based implementation the "in-body" start-tag handling for "li", "dd" & "dt" to for-loop Easier to read and comprehend --- HTMLKit/HTMLParser.m | 39 +++++++++++++-------------------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/HTMLKit/HTMLParser.m b/HTMLKit/HTMLParser.m index b8861c6..6975367 100644 --- a/HTMLKit/HTMLParser.m +++ b/HTMLKit/HTMLParser.m @@ -1140,39 +1140,26 @@ } else if ([tagName isEqualToAny:@"li", @"dd", @"dt", nil]) { /** li, dd & dt cases are all same, hence the merge */ _framesetOkFlag = NO; - HTMLElement *node = self.currentNode; - NSUInteger index = _stackOfOpenElements.count - 1; // Start Tag: li, dd, dt // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody - // No cycles ~> blocks instead of gotos - dispatch_block_t done = ^{ - if ([_stackOfOpenElements hasElementInButtonScopeWithTagName:@"p"]) { - [self closePElement]; + for (HTMLElement *node in _stackOfOpenElements.reverseObjectEnumerator.allObjects) { + if ([node.tagName isEqualToString:tagName]) { + [self generateImpliedEndTagsExceptForElement:tagName]; + if (![self.currentNode.tagName isEqualToString:tagName]) { + [self emitParseError:@"Unexpected Start Tag (%@) in ", tagName]; + } + [_stackOfOpenElements popElementsUntilElementPoppedWithTagName:tagName]; + break; + } else if (IsSpecialElement(node) && ![node.tagName isEqualToAny:@"address", @"div", @"p", nil]) { + break; } - }; - - dispatch_block_t loop = ^{ - [self generateImpliedEndTagsExceptForElement:tagName]; - if (![self.currentNode.tagName isEqualToString:tagName]) { - [self emitParseError:@"Unexpected Start Tag (%@) in ", tagName]; - } - [_stackOfOpenElements popElementsUntilElementPoppedWithTagName:tagName]; - done(); - }; - - if ([node.tagName isEqualToString:tagName]) { - loop(); } - - if (IsSpecialElement(node) && ![node.tagName isEqualToAny:@"address", @"div", @"p", nil]) { - done(); - } else { - node = _stackOfOpenElements[--index]; - loop(); + + if ([_stackOfOpenElements hasElementInButtonScopeWithTagName:@"p"]) { + [self closePElement]; } - [self insertElementForToken:token]; } else if ([tagName isEqualToString:@"plaintext"]) { if ([_stackOfOpenElements hasElementInButtonScopeWithTagName:@"p"]) {