From 6960b2a4cce65479e15f19369e7c3268d4b8a8a5 Mon Sep 17 00:00:00 2001
From: Nikolay Yakimov <root@livid.pp.ru>
Date: Sat, 28 Mar 2015 02:53:33 +0300
Subject: [PATCH 1/3] Markdown Reader: Disable meta exts for meta values

Disable all metadata block extensions when parsing metadata field
values. Issue #2026
---
 src/Text/Pandoc/Readers/Markdown.hs | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs
index 55ec256f8..bd436da87 100644
--- a/src/Text/Pandoc/Readers/Markdown.hs
+++ b/src/Text/Pandoc/Readers/Markdown.hs
@@ -281,13 +281,18 @@ ignorable t = T.pack "_" `T.isSuffixOf` t
 
 toMetaValue :: ReaderOptions -> Text -> MetaValue
 toMetaValue opts x =
-  case readMarkdown opts (T.unpack x) of
+  case readMarkdown opts' (T.unpack x) of
        Pandoc _ [Plain xs] -> MetaInlines xs
        Pandoc _ [Para xs]
          | endsWithNewline x -> MetaBlocks [Para xs]
          | otherwise         -> MetaInlines xs
        Pandoc _ bs           -> MetaBlocks bs
   where endsWithNewline t = T.pack "\n" `T.isSuffixOf` t
+        opts' = opts{readerExtensions=readerExtensions opts `Set.difference` meta_exts}
+        meta_exts = Set.fromList [ Ext_pandoc_title_block
+                                 , Ext_mmd_title_block
+                                 , Ext_yaml_metadata_block
+                                 ]
 
 yamlToMeta :: ReaderOptions -> Yaml.Value -> MetaValue
 yamlToMeta opts (Yaml.String t) = toMetaValue opts t

From 7091002966bf6cacc6674a195fd03696dc71edf5 Mon Sep 17 00:00:00 2001
From: Nikolay Yakimov <root@livid.pp.ru>
Date: Sat, 28 Mar 2015 02:57:33 +0300
Subject: [PATCH 2/3] Markdown Reader: Req. " " after key in mmd title block

Require space after key-value delimiter colon in mmd title block.
Issue #2026
Amend: parsec's `spaces` include newlines, but we don't want that. Had
to make custom `spaceNoNewline` parser here
---
 src/Text/Pandoc/Readers/Markdown.hs | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs
index bd436da87..9d37808ee 100644
--- a/src/Text/Pandoc/Readers/Markdown.hs
+++ b/src/Text/Pandoc/Readers/Markdown.hs
@@ -35,7 +35,7 @@ import Data.List ( transpose, sortBy, intersperse, intercalate, elemIndex)
 import qualified Data.Map as M
 import Data.Scientific (coefficient, base10Exponent)
 import Data.Ord ( comparing )
-import Data.Char ( isAlphaNum, toLower )
+import Data.Char ( isSpace, isAlphaNum, toLower )
 import Data.Maybe
 import Text.Pandoc.Definition
 import qualified Data.Text as T
@@ -326,11 +326,14 @@ mmdTitleBlock = try $ do
 kvPair :: MarkdownParser (String, MetaValue)
 kvPair = try $ do
   key <- many1Till (alphaNum <|> oneOf "_- ") (char ':')
+  skipMany1 spaceNoNewline
   val <- manyTill anyChar
           (try $ newline >> lookAhead (blankline <|> nonspaceChar))
   let key' = concat $ words $ map toLower key
   let val' = MetaBlocks $ B.toList $ B.plain $ B.text $ trim val
   return (key',val')
+  where
+    spaceNoNewline = satisfy (\x -> isSpace x && (x/='\n') && (x/='\r'))
 
 parseMarkdown :: MarkdownParser Pandoc
 parseMarkdown = do

From 5f7639a0d6e74527930b2c8060898df5177ce82e Mon Sep 17 00:00:00 2001
From: Nikolay Yakimov <root@livid.pp.ru>
Date: Sat, 28 Mar 2015 07:07:03 +0300
Subject: [PATCH 3/3] Markdown Reader: Require nonempty value in mmd title
 block

`many1Till` will gobble up newline, and then whole following line will
match, so I had to use guard here.
---
 src/Text/Pandoc/Readers/Markdown.hs | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs
index 9d37808ee..8892f60fb 100644
--- a/src/Text/Pandoc/Readers/Markdown.hs
+++ b/src/Text/Pandoc/Readers/Markdown.hs
@@ -329,6 +329,7 @@ kvPair = try $ do
   skipMany1 spaceNoNewline
   val <- manyTill anyChar
           (try $ newline >> lookAhead (blankline <|> nonspaceChar))
+  guard $ not . null . trim $ val
   let key' = concat $ words $ map toLower key
   let val' = MetaBlocks $ B.toList $ B.plain $ B.text $ trim val
   return (key',val')