From 167fc4bc8732b72cccda0c37139fee3ab94b05cb Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Tue, 27 Aug 2019 10:15:00 -0700
Subject: [PATCH] Markdown reader: Headers: don't parse content over newline
 boundary.

Closes #5714.
---
 src/Text/Pandoc/Readers/Markdown.hs | 19 +++++++++++++++----
 test/command/5714.md                | 13 +++++++++++++
 2 files changed, 28 insertions(+), 4 deletions(-)
 create mode 100644 test/command/5714.md

diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs
index d688e3d1d..e626321e6 100644
--- a/src/Text/Pandoc/Readers/Markdown.hs
+++ b/src/Text/Pandoc/Readers/Markdown.hs
@@ -532,8 +532,13 @@ atxHeader = try $ do
                   (char '.' <|> char ')') -- this would be a list
   guardDisabled Ext_space_in_atx_header <|> notFollowedBy nonspaceChar
   skipSpaces
-  (text, raw) <- withRaw $
-          trimInlinesF . mconcat <$> many (notFollowedBy atxClosing >> inline)
+  (text, raw) <- withRaw $ do
+    oldAllowLineBreaks <- stateAllowLineBreaks <$> getState
+    updateState $ \st -> st{ stateAllowLineBreaks = False }
+    res <- trimInlinesF . mconcat <$>
+               many (notFollowedBy atxClosing >> inline)
+    updateState $ \st -> st{ stateAllowLineBreaks = oldAllowLineBreaks }
+    return res
   attr <- atxClosing
   attr' <- registerHeader attr (runF text defaultParserState)
   guardDisabled Ext_implicit_header_references
@@ -576,8 +581,13 @@ setextHeader = try $ do
   -- unless necessary -- it gives a significant performance boost.
   lookAhead $ anyLine >> many1 (oneOf setextHChars) >> blankline
   skipSpaces
-  (text, raw) <- withRaw $
-       trimInlinesF . mconcat <$> many1 (notFollowedBy setextHeaderEnd >> inline)
+  (text, raw) <- withRaw $ do
+    oldAllowLineBreaks <- stateAllowLineBreaks <$> getState
+    updateState $ \st -> st{ stateAllowLineBreaks = False }
+    res <- trimInlinesF . mconcat <$>
+               many (notFollowedBy setextHeaderEnd >> inline)
+    updateState $ \st -> st{ stateAllowLineBreaks = oldAllowLineBreaks }
+    return res
   attr <- setextHeaderEnd
   underlineChar <- oneOf setextHChars
   many (char underlineChar)
@@ -1730,6 +1740,7 @@ endline :: PandocMonad m => MarkdownParser m (F Inlines)
 endline = try $ do
   newline
   notFollowedBy blankline
+  getState >>= guard . stateAllowLineBreaks
   -- parse potential list-starts differently if in a list:
   notFollowedBy (inList >> listStart)
   guardDisabled Ext_lists_without_preceding_blankline <|> notFollowedBy listStart
diff --git a/test/command/5714.md b/test/command/5714.md
new file mode 100644
index 000000000..48e25c1a2
--- /dev/null
+++ b/test/command/5714.md
@@ -0,0 +1,13 @@
+```
+% pandoc -t native
+# hi _a
+b_
+
+# hi _c
+c
+^D
+[Header 1 ("hi-_a",[],[]) [Str "hi",Space,Str "_a"]
+,Para [Str "b_"]
+,Header 1 ("hi-_c",[],[]) [Str "hi",Space,Str "_c"]
+,Para [Str "c"]]
+```