@@ -469,7 +469,7 @@ pCloses :: String -> TagParser ()
469pCloses tagtype = try $ do
469pCloses tagtype = try $ do
470 t <- lookAhead $ pSatisfy $ \tag -> isTagClose tag || isTagOpen tag
470 t <- lookAhead $ pSatisfy $ \tag -> isTagClose tag || isTagOpen tag
471 case t of
471 case t of
472− (TagClose t') | t' == tagtype -> pAnyTag >> return ()
472+ (TagClose t') | t' == tagtype -> pAnyTag >> return ()
473 (TagOpen t' _) | t' `closes` tagtype -> return ()
473 (TagOpen t' _) | t' `closes` tagtype -> return ()
474 (TagClose "ul") | tagtype == "li" -> return ()
474 (TagClose "ul") | tagtype == "li" -> return ()
475 (TagClose "ol") | tagtype == "li" -> return ()
475 (TagClose "ol") | tagtype == "li" -> return ()
@@ -627,7 +627,7 @@ isCommentTag :: Tag String -> Bool
627isCommentTag = tagComment (const True)
627isCommentTag = tagComment (const True)
629-- taken from HXT and extended
629-- taken from HXT and extended
630−
630+-- See http://www.w3.org/TR/html5/syntax.html sec 8.1.2.4 optional tags
631closes :: String -> String -> Bool
631closes :: String -> String -> Bool
632_ `closes` "body" = False
632_ `closes` "body" = False
633_ `closes` "html" = False
633_ `closes` "html" = False
@@ -635,11 +635,18 @@ _ `closes` "html" = False
635"li" `closes` "li" = True
635"li" `closes` "li" = True
636"th" `closes` t | t `elem` ["th","td"] = True
636"th" `closes` t | t `elem` ["th","td"] = True
637"tr" `closes` t | t `elem` ["th","td","tr"] = True
637"tr" `closes` t | t `elem` ["th","td","tr"] = True
638+"dd" `closes` t | t `elem` ["dt", "dd"] = True
638"dt" `closes` t | t `elem` ["dt","dd"] = True
639"dt" `closes` t | t `elem` ["dt","dd"] = True
639−"hr" `closes` "p" = True
640+"rt" `closes` t | t `elem` ["rb", "rt", "rtc"] = True
640−"p" `closes` "p" = True
641+"optgroup" `closes` "optgroup" = True
642+"optgroup" `closes` "option" = True
643+"option" `closes` "option" = True
644+-- http://www.w3.org/TR/html-markup/p.html
645+x `closes` "p" | x `elem` ["address", "article", "aside", "blockquote",
646+ "dir", "div", "dl", "fieldset", "footer", "form", "h1", "h2", "h3", "h4",
647+ "h5", "h6", "header", "hr", "menu", "nav", "ol", "p", "pre", "section",
648+ "table", "ul"] = True
641"meta" `closes` "meta" = True
649"meta" `closes` "meta" = True
642−"colgroup" `closes` "colgroup" = True
643"form" `closes` "form" = True
650"form" `closes` "form" = True
644"label" `closes` "label" = True
651"label" `closes` "label" = True
645"map" `closes` "map" = True
652"map" `closes` "map" = True