@@ -971,11 +971,20 @@ htmlTag :: Monad m
971htmlTag f = try $ do
971htmlTag f = try $ do
972 lookAhead (char '<')
972 lookAhead (char '<')
973 inp <- getInput
973 inp <- getInput
974− let (next : rest) = canonicalizeTags $ parseTagsOptions
974+ let (next : _) = canonicalizeTags $ parseTagsOptions
975− parseOptions{ optTagWarning = True } inp
975+ parseOptions{ optTagWarning = False } inp
976 guard $ f next
976 guard $ f next
977+ let handleTag tagname = do
978+ -- <www.boe.es/buscar/act.php?id=BOE-A-1996-8930#a66>
979+ -- should NOT be parsed as an HTML tag, see #2277
980+ guard $ not ('.' `elem` tagname)
981+ -- <https://example.org> should NOT be a tag either.
982+ -- tagsoup will parse it as TagOpen "https:" [("example.org","")]
983+ guard $ not (null tagname)
984+ guard $ last tagname /= ':'
985+ rendered <- manyTill anyChar (char '>')
986+ return (next, rendered ++ ">")
977 case next of
987 case next of
978− TagWarning _ -> fail "encountered TagWarning"
979 TagComment s
988 TagComment s
980 | "<!--" `isPrefixOf` inp -> do
989 | "<!--" `isPrefixOf` inp -> do
981 count (length s + 4) anyChar
990 count (length s + 4) anyChar
@@ -983,13 +992,9 @@ htmlTag f = try $ do
984 return (next, "<!--" ++ s ++ "-->")
993 return (next, "<!--" ++ s ++ "-->")
985 | otherwise -> fail "bogus comment mode, HTML5 parse error"
994 | otherwise -> fail "bogus comment mode, HTML5 parse error"
986− _ -> do
995+ TagOpen tagname _attr -> handleTag tagname
987− -- we get a TagWarning on things like
996+ TagClose tagname -> handleTag tagname
988− -- <www.boe.es/buscar/act.php?id=BOE-A-1996-8930#a66>
997+ _ -> mzero
989− -- which should NOT be parsed as an HTML tag, see #2277
990− guard $ not $ hasTagWarning rest
991− rendered <- manyTill anyChar (char '>')
992− return (next, rendered ++ ">")
994mkAttr :: [(String, String)] -> Attr
999mkAttr :: [(String, String)] -> Attr
995mkAttr attr = (attribsId, attribsClasses, attribsKV)
1000mkAttr attr = (attribsId, attribsClasses, attribsKV)