diff options
author | John MacFarlane <fiddlosopher@gmail.com> | 2013-06-30 23:37:27 -0700 |
---|---|---|
committer | John MacFarlane <fiddlosopher@gmail.com> | 2013-06-30 23:37:27 -0700 |
commit | 5d01e9a117b77a0f51ce67d495b9e54881a878a5 (patch) | |
tree | b11b8ad448fe5da2511b931dd480e9e6133b8dab /src/Text/Pandoc | |
parent | a1f010de7830777b86f88743785560a04fab62fd (diff) | |
download | pandoc-5d01e9a117b77a0f51ce67d495b9e54881a878a5.tar.gz |
Markdown writer: Support yaml title block.
Diffstat (limited to 'src/Text/Pandoc')
-rw-r--r-- | src/Text/Pandoc/Writers/Markdown.hs | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/src/Text/Pandoc/Writers/Markdown.hs b/src/Text/Pandoc/Writers/Markdown.hs index d37146346..d8ac99685 100644 --- a/src/Text/Pandoc/Writers/Markdown.hs +++ b/src/Text/Pandoc/Writers/Markdown.hs @@ -46,6 +46,10 @@ import Text.Pandoc.Readers.TeXMath (readTeXMath) import Text.HTML.TagSoup (renderTags, parseTags, isTagText, Tag(..)) import Network.URI (isAbsoluteURI) import Data.Default +import Data.Yaml (Value(Object,String,Array,Bool,Number)) +import qualified Data.HashMap.Strict as H +import qualified Data.Vector as V +import qualified Data.Text as T type Notes = [[Block]] type Refs = [([Inline], Target)] @@ -109,16 +113,42 @@ plainTitleBlock tit auths dat = (hcat (intersperse (text "; ") auths)) <> cr <> dat <> cr +yamlTitleBlock :: Value -> Doc +yamlTitleBlock v = "---" $$ (jsonToYaml v) $$ "..." + +jsonToYaml :: Value -> Doc +jsonToYaml (Object hashmap) = + vcat (map (\(k,v) -> + text (T.unpack k) <> ":" <> space <> jsonToYaml v) $ H.toList hashmap) +jsonToYaml (Array vec) = + cr <> vcat (map (\v -> hang 2 "- " (jsonToYaml v)) $ V.toList vec) +jsonToYaml (String s) + | "\n" `T.isInfixOf` s = hang 2 ("|" <> cr) $ text $ T.unpack s + | otherwise = text $ "'" ++ substitute "'" "''" (T.unpack s) ++ "'" +jsonToYaml (Bool b) = text $ show b +jsonToYaml (Number n) = text $ show n +jsonToYaml _ = empty + -- | Return markdown representation of document. pandocToMarkdown :: WriterOptions -> Pandoc -> State WriterState String pandocToMarkdown opts (Pandoc meta blocks) = do title' <- inlineListToMarkdown opts $ docTitle meta authors' <- mapM (inlineListToMarkdown opts) $ docAuthors meta date' <- inlineListToMarkdown opts $ docDate meta + let colwidth = if writerWrapText opts + then Just $ writerColumns opts + else Nothing + metadata <- metaToJSON + (fmap (render colwidth) . blockListToMarkdown opts) + (fmap (render colwidth) . inlineListToMarkdown opts) + (writerVariables opts) + meta isPlain <- gets stPlain let titleblock = case True of _ | isPlain -> plainTitleBlock title' authors' date' + | isEnabled Ext_yaml_title_block opts -> + yamlTitleBlock metadata | isEnabled Ext_pandoc_title_block opts -> pandocTitleBlock title' authors' date' | isEnabled Ext_mmd_title_block opts -> @@ -128,14 +158,6 @@ pandocToMarkdown opts (Pandoc meta blocks) = do let toc = if writerTableOfContents opts then tableOfContents opts headerBlocks else empty - let colwidth = if writerWrapText opts - then Just $ writerColumns opts - else Nothing - metadata <- metaToJSON - (fmap (render colwidth) . blockListToMarkdown opts) - (fmap (render colwidth) . inlineListToMarkdown opts) - (writerVariables opts) - meta body <- blockListToMarkdown opts blocks st <- get notes' <- notesToMarkdown opts (reverse $ stNotes st) |