@@ -39,6 +39,7 @@ import Text.Pandoc.Writers.Shared
39import Text.Pandoc.Options
39import Text.Pandoc.Options
40import Text.Pandoc.Parsing hiding (blankline, char, space)
40import Text.Pandoc.Parsing hiding (blankline, char, space)
41import Data.List ( group, isPrefixOf, find, intersperse, transpose, sortBy )
41import Data.List ( group, isPrefixOf, find, intersperse, transpose, sortBy )
42+import Data.Char ( isSpace )
42import Data.Ord ( comparing )
43import Data.Ord ( comparing )
43import Text.Pandoc.Pretty
44import Text.Pandoc.Pretty
44import Control.Monad.State
45import Control.Monad.State
@@ -103,11 +104,26 @@ pandocTitleBlock tit auths dat =
103 hang 2 (text "% ") (vcat $ map nowrap auths) <> cr <>
104 hang 2 (text "% ") (vcat $ map nowrap auths) <> cr <>
104 hang 2 (text "% ") dat <> cr
105 hang 2 (text "% ") dat <> cr
106−mmdTitleBlock :: Doc -> [Doc] -> Doc -> Doc
107+mmdTitleBlock :: Value -> Doc
107−mmdTitleBlock tit auths dat =
108+mmdTitleBlock (Object hashmap) =
108− hang 8 (text "Title: ") tit <> cr <>
109+ vcat $ map go $ sortBy (comparing fst) $ H.toList hashmap
111+ case (text (T.unpack k), v) of
113+ | V.null vec -> empty
114+ | otherwise -> k' <> ":" <> space <>
109− hang 8 (text "Author: ") (hcat (intersperse (text "; ") auths)) <> cr <>
115+ hcat (intersperse "; "
110− hang 8 (text "Date: ") dat <> cr
116+ (map fromstr $ V.toList vec))
117+ (_, String "") -> empty
118+ (k', x) -> k' <> ":" <> space <> nest 2 (fromstr x)
119+ fromstr (String s) = text (removeBlankLines $ T.unpack s)
120+ fromstr (Bool b) = text (show b)
121+ fromstr (Number n) = text (show n)
123+ -- blank lines not allowed in MMD metadata - we replace with .
124+ removeBlankLines = trimr . unlines . map (\x ->
125+ if all isSpace x then "." else x) . lines
126+mmdTitleBlock _ = empty
112plainTitleBlock :: Doc -> [Doc] -> Doc -> Doc
128plainTitleBlock :: Doc -> [Doc] -> Doc -> Doc
113plainTitleBlock tit auths dat =
129plainTitleBlock tit auths dat =
@@ -147,6 +163,7 @@ pandocToMarkdown opts (Pandoc meta blocks) = do
147 let colwidth = if writerWrapText opts
163 let colwidth = if writerWrapText opts
148 then Just $ writerColumns opts
164 then Just $ writerColumns opts
149 else Nothing
165 else Nothing
166+ isPlain <- gets stPlain
150 metadata <- metaToJSON opts
167 metadata <- metaToJSON opts
151 (fmap (render colwidth) . blockListToMarkdown opts)
168 (fmap (render colwidth) . blockListToMarkdown opts)
152 (fmap (render colwidth) . inlineListToMarkdown opts)
169 (fmap (render colwidth) . inlineListToMarkdown opts)
@@ -154,7 +171,6 @@ pandocToMarkdown opts (Pandoc meta blocks) = do
154 let title' = maybe empty text $ getField "title" metadata
171 let title' = maybe empty text $ getField "title" metadata
155 let authors' = maybe [] (map text) $ getField "author" metadata
172 let authors' = maybe [] (map text) $ getField "author" metadata
156 let date' = maybe empty text $ getField "date" metadata
173 let date' = maybe empty text $ getField "date" metadata
157− isPlain <- gets stPlain
158 let titleblock = case writerStandalone opts of
174 let titleblock = case writerStandalone opts of
159 True | isPlain ->
175 True | isPlain ->
160 plainTitleBlock title' authors' date'
176 plainTitleBlock title' authors' date'
@@ -163,7 +179,7 @@ pandocToMarkdown opts (Pandoc meta blocks) = do
163 | isEnabled Ext_pandoc_title_block opts ->
179 | isEnabled Ext_pandoc_title_block opts ->
164 pandocTitleBlock title' authors' date'
180 pandocTitleBlock title' authors' date'
165 | isEnabled Ext_mmd_title_block opts ->
181 | isEnabled Ext_mmd_title_block opts ->
166− mmdTitleBlock title' authors' date'
182+ mmdTitleBlock metadata
167 | otherwise -> empty
183 | otherwise -> empty
168 False -> empty
184 False -> empty
169 let headerBlocks = filter isHeaderBlock blocks
185 let headerBlocks = filter isHeaderBlock blocks