@@ -31,6 +31,7 @@ Markdown: <http://daringfireball.net/projects/markdown/>
3131-}
3232module Text.Pandoc.Writers.Markdown ( writeMarkdown) where
3333import Text.Pandoc.Definition
34+import Text.Pandoc.Templates
3435import Text.Pandoc.Shared
3536import Text.Pandoc.Blocks
3637import Text.ParserCombinators.Parsec ( parse, GenParser )
@@ -45,33 +46,36 @@ type WriterState = (Notes, Refs)
4546-- | Convert Pandoc to Markdown.
4647writeMarkdown :: WriterOptions -> Pandoc -> String
4748writeMarkdown opts document =
48− render $ evalState (pandocToMarkdown opts document) ([],[])
49+ evalState (pandocToMarkdown opts document) ([],[])
4950
5051-- | Return markdown representation of document.
51−pandocToMarkdown :: WriterOptions -> Pandoc -> State WriterState Doc
52+pandocToMarkdown :: WriterOptions -> Pandoc -> State WriterState String
5253pandocToMarkdown opts (Pandoc meta blocks) = do
53− return empty -- TODO
54−-- let before = writerIncludeBefore opts
55−-- let after = writerIncludeAfter opts
56−-- let header = writerHeader opts
57−-- let before' = if null before then empty else text before
58−-- let after' = if null after then empty else text after
59−-- let header' = if null header then empty else text header
60−-- metaBlock <- metaToMarkdown opts meta
61−-- let head' = if writerStandalone opts
62−-- then metaBlock $+$ header'
63−-- else empty
64−-- let headerBlocks = filter isHeaderBlock blocks
65−-- let toc = if writerTableOfContents opts
66−-- then tableOfContents opts headerBlocks
67−-- else empty
68−-- body <- blockListToMarkdown opts blocks
69−-- (notes, _) <- get
70−-- notes' <- notesToMarkdown opts (reverse notes)
71−-- (_, refs) <- get -- note that the notes may contain refs
72−-- refs' <- keyTableToMarkdown opts (reverse refs)
73−-- return $ head' $+$ before' $+$ toc $+$ body $+$ text "" $+$
74−-- notes' $+$ text "" $+$ refs' $+$ after'
54+ metaBlock <- metaToMarkdown opts meta
55+ let head' = if writerStandalone opts
56+ then metaBlock
57+ else empty
58+ let headerBlocks = filter isHeaderBlock blocks
59+ let toc = if writerTableOfContents opts
60+ then tableOfContents opts headerBlocks
61+ else empty
62+ body <- blockListToMarkdown opts blocks
63+ (notes, _) <- get
64+ notes' <- notesToMarkdown opts (reverse notes)
65+ (_, refs) <- get -- note that the notes may contain refs
66+ refs' <- keyTableToMarkdown opts (reverse refs)
67+ let context = writerVariables opts ++
68+ [ ("toc", render toc)
69+ , ("body", render $ body $+$ text "" $+$ notes' $+$
70+ text "" $+$ refs')
71+ , ("titleblock", render head')
72+ ]
73+ let templ = if writerStandalone opts
74+ then writerTemplate opts
75+ else "$if(toc)$$toc$\n$endif$" ++
76+ "$if(before)$$before$\n$endif$" ++
77+ "$body$$if(after)$$after$\n$endif$"
78+ return $ renderTemplate context templ
7579
7680-- | Return markdown representation of reference key table.
7781keyTableToMarkdown :: WriterOptions -> KeyTable -> State WriterState Doc