git.iko.soy/typeable/pandoc
on master help sign in
Markdown + HTML readers: be more forgiving about unescaped &.

We are now more forgiving about parsing invalid HTML with unescaped `&` as raw HTML. (Previously any unescaped `&` would cause pandoc not to recognize the string as raw HTML.) Closes #2410.

commit773bbb8fc73a3b6598188dbae64a841eb6680b38 authorJohn MacFarlane <jgm@berkeley.edu> dateSun 10 Apr 2016, 07:39 (11 years ago) parentcb8b1c2
1 file changed+15−10
src/Text/Pandoc/Readers/HTML.hs+15−10
src/Text/Pandoc/Readers/HTML.hs+15−10
@@ -971,11 +971,20 @@ htmlTag :: Monad m
971971htmlTag f = try $ do
972972 lookAhead (char '<')
973973 inp <- getInput
974− let (next : rest) = canonicalizeTags $ parseTagsOptions
975− parseOptions{ optTagWarning = True } inp
974+ let (next : _) = canonicalizeTags $ parseTagsOptions
975+ parseOptions{ optTagWarning = False } inp
976976 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 ++ ">")
977987 case next of
978− TagWarning _ -> fail "encountered TagWarning"
979988 TagComment s
980989 | "<!--" `isPrefixOf` inp -> do
981990 count (length s + 4) anyChar
@@ -983,13 +992,9 @@ htmlTag f = try $ do
983992 char '>'
984993 return (next, "<!--" ++ s ++ "-->")
985994 | otherwise -> fail "bogus comment mode, HTML5 parse error"
986− _ -> do
987− -- we get a TagWarning on things like
988− -- <www.boe.es/buscar/act.php?id=BOE-A-1996-8930#a66>
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 ++ ">")
995+ TagOpen tagname _attr -> handleTag tagname
996+ TagClose tagname -> handleTag tagname
997+ _ -> mzero
993998
994999mkAttr :: [(String, String)] -> Attr
9951000mkAttr attr = (attribsId, attribsClasses, attribsKV)