diff --git a/HTMLKit/HTMLParser.m b/HTMLKit/HTMLParser.m index f6ed582..38b3b46 100644 --- a/HTMLKit/HTMLParser.m +++ b/HTMLKit/HTMLParser.m @@ -411,39 +411,35 @@ return; } - __block NSUInteger index = _listOfActiveFormattingElements.count - 1; - __block id entry = _listOfActiveFormattingElements[index]; + NSInteger index = _listOfActiveFormattingElements.count - 1; + HTMLElement *entry = _listOfActiveFormattingElements[index]; // Reconstruct the active formatting elements // https://html.spec.whatwg.org/multipage/syntax.html#reconstruct-the-active-formatting-elements - // No cycles ~> blocks instead of gotos - dispatch_block_t advance = ^{ - entry = _listOfActiveFormattingElements[index++]; - }; + // Rewind phase + while (![entry isEqual:[HTMLMarker marker]] && ![_stackOfOpenElements constainsElement:entry]) { + if (index == 0) { + index--; + break; + } + entry = _listOfActiveFormattingElements[--index]; + } - dispatch_block_t create = ^{ - HTMLElement *entry = _listOfActiveFormattingElements[index]; + while (YES) { + // Advance phase + entry = _listOfActiveFormattingElements[++index]; + + // Create phase HTMLStartTagToken *token = [[HTMLStartTagToken alloc] initWithTagName:entry.tagName attributes:entry.attributes]; HTMLElement *element = [self insertElementForToken:token]; [_listOfActiveFormattingElements replaceElementAtIndex:index withElement:element]; - if (index++ != _listOfActiveFormattingElements.count) { - advance(); - } - }; - dispatch_block_t rewind = ^{ - if (index == 0) { - create(); + if (element == _listOfActiveFormattingElements.lastEntry) { + break; } - entry = _listOfActiveFormattingElements[index--]; - if (entry != [HTMLMarker marker] && ![_stackOfOpenElements constainsElement:entry]) { - rewind(); - } - }; - - rewind(); + } } - (void)generateImpliedEndTagsExceptForElement:(NSString *)tagName