git.iko.soy/typeable/pandoc
on master help sign in
Write full metadata in MMD style title blocks.
commit1f7ce4a2cd0ce62c317267acdfe9c9382ed76e61 authorJohn MacFarlane <fiddlosopher@gmail.com> dateTue 2 Jul 2013, 09:03 (13 years ago) parent0fa5792
1 file changed+23−7
src/Text/Pandoc/Writers/Markdown.hs+23−7
src/Text/Pandoc/Writers/Markdown.hs+23−7
@@ -39,6 +39,7 @@ import Text.Pandoc.Writers.Shared
3939import Text.Pandoc.Options
4040import Text.Pandoc.Parsing hiding (blankline, char, space)
4141import Data.List ( group, isPrefixOf, find, intersperse, transpose, sortBy )
42+import Data.Char ( isSpace )
4243import Data.Ord ( comparing )
4344import Text.Pandoc.Pretty
4445import Control.Monad.State
@@ -103,11 +104,26 @@ pandocTitleBlock tit auths dat =
103104 hang 2 (text "% ") (vcat $ map nowrap auths) <> cr <>
104105 hang 2 (text "% ") dat <> cr
105106
106−mmdTitleBlock :: Doc -> [Doc] -> Doc -> Doc
107−mmdTitleBlock tit auths dat =
108− hang 8 (text "Title: ") tit <> cr <>
109− hang 8 (text "Author: ") (hcat (intersperse (text "; ") auths)) <> cr <>
110− hang 8 (text "Date: ") dat <> cr
107+mmdTitleBlock :: Value -> Doc
108+mmdTitleBlock (Object hashmap) =
109+ vcat $ map go $ sortBy (comparing fst) $ H.toList hashmap
110+ where go (k,v) =
111+ case (text (T.unpack k), v) of
112+ (k', Array vec)
113+ | V.null vec -> empty
114+ | otherwise -> k' <> ":" <> space <>
115+ hcat (intersperse "; "
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)
122+ fromstr _ = empty
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
111127
112128plainTitleBlock :: Doc -> [Doc] -> Doc -> Doc
113129plainTitleBlock tit auths dat =
@@ -147,6 +163,7 @@ pandocToMarkdown opts (Pandoc meta blocks) = do
147163 let colwidth = if writerWrapText opts
148164 then Just $ writerColumns opts
149165 else Nothing
166+ isPlain <- gets stPlain
150167 metadata <- metaToJSON opts
151168 (fmap (render colwidth) . blockListToMarkdown opts)
152169 (fmap (render colwidth) . inlineListToMarkdown opts)
@@ -154,7 +171,6 @@ pandocToMarkdown opts (Pandoc meta blocks) = do
154171 let title' = maybe empty text $ getField "title" metadata
155172 let authors' = maybe [] (map text) $ getField "author" metadata
156173 let date' = maybe empty text $ getField "date" metadata
157− isPlain <- gets stPlain
158174 let titleblock = case writerStandalone opts of
159175 True | isPlain ->
160176 plainTitleBlock title' authors' date'
@@ -163,7 +179,7 @@ pandocToMarkdown opts (Pandoc meta blocks) = do
163179 | isEnabled Ext_pandoc_title_block opts ->
164180 pandocTitleBlock title' authors' date'
165181 | isEnabled Ext_mmd_title_block opts ->
166− mmdTitleBlock title' authors' date'
182+ mmdTitleBlock metadata
167183 | otherwise -> empty
168184 False -> empty
169185 let headerBlocks = filter isHeaderBlock blocks