git.iko.soy/typeable/pandoc
on master help sign in
Converted DokuWiki writer to use PandocMonad.
commit1012e668cfd57c919e930a7919a9bd69a7c3a486 authorJohn MacFarlane <jgm@berkeley.edu> dateSun 12 Mar 2017, 23:15 (10 years ago) parentdf7a443
1 file changed+34−25
src/Text/Pandoc/Writers/DokuWiki.hs+34−25
src/Text/Pandoc/Writers/DokuWiki.hs+34−25
@@ -41,11 +41,12 @@ DokuWiki: <https://www.dokuwiki.org/dokuwiki>
4141module Text.Pandoc.Writers.DokuWiki ( writeDokuWiki ) where
4242import Control.Monad (zipWithM)
4343import Control.Monad.Reader (ReaderT, ask, local, runReaderT)
44−import Control.Monad.State (State, evalState, gets, modify)
44+import Control.Monad.State (StateT, evalStateT, gets, modify)
4545import Data.Default (Default (..))
4646import Data.List (intercalate, intersect, isPrefixOf, transpose)
4747import Network.URI (isURI)
48−import Text.Pandoc.Class (PandocMonad)
48+import Text.Pandoc.Class (PandocMonad, report)
49+import Text.Pandoc.Logging
4950import Text.Pandoc.Definition
5051import Text.Pandoc.ImageSize
5152import Text.Pandoc.Options (WrapOption (..), WriterOptions (writerTableOfContents, writerTemplate, writerWrapText))
@@ -72,18 +73,19 @@ instance Default WriterEnvironment where
7273 , stUseTags = False
7374 , stBackSlashLB = False }
7475
75−type DokuWiki = ReaderT WriterEnvironment (State WriterState)
76+type DokuWiki m = ReaderT WriterEnvironment (StateT WriterState m)
7677
7778-- | Convert Pandoc to DokuWiki.
7879writeDokuWiki :: PandocMonad m => WriterOptions -> Pandoc -> m String
79−writeDokuWiki opts document = return $
80+writeDokuWiki opts document =
8081 runDokuWiki (pandocToDokuWiki opts document)
8182
82−runDokuWiki :: DokuWiki a -> a
83−runDokuWiki = flip evalState def . flip runReaderT def
83+runDokuWiki :: PandocMonad m => DokuWiki m a -> m a
84+runDokuWiki = flip evalStateT def . flip runReaderT def
8485
8586-- | Return DokuWiki representation of document.
86−pandocToDokuWiki :: WriterOptions -> Pandoc -> DokuWiki String
87+pandocToDokuWiki :: PandocMonad m
88+ => WriterOptions -> Pandoc -> DokuWiki m String
8789pandocToDokuWiki opts (Pandoc meta blocks) = do
8890 metadata <- metaToJSON opts
8991 (fmap trimr . blockListToDokuWiki opts)
@@ -110,9 +112,10 @@ escapeString = substitute "__" "%%__%%" .
110112 substitute "//" "%%//%%"
111113
112114-- | Convert Pandoc block element to DokuWiki.
113−blockToDokuWiki :: WriterOptions -- ^ Options
115+blockToDokuWiki :: PandocMonad m
116+ => WriterOptions -- ^ Options
114117 -> Block -- ^ Block element
115− -> DokuWiki String
118+ -> DokuWiki m String
116119
117120blockToDokuWiki _ Null = return ""
118121
@@ -147,12 +150,12 @@ blockToDokuWiki opts (Para inlines) = do
147150blockToDokuWiki opts (LineBlock lns) =
148151 blockToDokuWiki opts $ linesToPara lns
149152
150−blockToDokuWiki _ (RawBlock f str)
153+blockToDokuWiki _ b@(RawBlock f str)
151154 | f == Format "dokuwiki" = return str
152155 -- See https://www.dokuwiki.org/wiki:syntax
153156 -- use uppercase HTML tag for block-level content:
154157 | f == Format "html" = return $ "<HTML>\n" ++ str ++ "\n</HTML>"
155− | otherwise = return ""
158+ | otherwise = "" <$ (report $ BlockNotRendered b)
156159
157160blockToDokuWiki _ HorizontalRule = return "\n----\n"
158161
@@ -276,7 +279,8 @@ listAttribsToString (startnum, numstyle, _) =
276279 else "")
277280
278281-- | Convert bullet list item (list of blocks) to DokuWiki.
279−listItemToDokuWiki :: WriterOptions -> [Block] -> DokuWiki String
282+listItemToDokuWiki :: PandocMonad m
283+ => WriterOptions -> [Block] -> DokuWiki m String
280284listItemToDokuWiki opts items = do
281285 contents <- blockListToDokuWiki opts items
282286 useTags <- stUseTags <$> ask
@@ -290,7 +294,7 @@ listItemToDokuWiki opts items = do
290294
291295-- | Convert ordered list item (list of blocks) to DokuWiki.
292296-- | TODO Emiminate dreadful duplication of text from listItemToDokuWiki
293−orderedListItemToDokuWiki :: WriterOptions -> [Block] -> DokuWiki String
297+orderedListItemToDokuWiki :: PandocMonad m => WriterOptions -> [Block] -> DokuWiki m String
294298orderedListItemToDokuWiki opts items = do
295299 contents <- blockListToDokuWiki opts items
296300 useTags <- stUseTags <$> ask
@@ -303,9 +307,10 @@ orderedListItemToDokuWiki opts items = do
303307 return $ indent' ++ "- " ++ contents
304308
305309-- | Convert definition list item (label, list of blocks) to DokuWiki.
306−definitionListItemToDokuWiki :: WriterOptions
310+definitionListItemToDokuWiki :: PandocMonad m
311+ => WriterOptions
307312 -> ([Inline],[[Block]])
308− -> DokuWiki String
313+ -> DokuWiki m String
309314definitionListItemToDokuWiki opts (label, items) = do
310315 labelText <- inlineListToDokuWiki opts label
311316 contents <- mapM (blockListToDokuWiki opts) items
@@ -370,10 +375,11 @@ backSlashLineBreaks cs = reverse $ g $ reverse $ concatMap f cs
370375
371376-- Auxiliary functions for tables:
372377
373−tableItemToDokuWiki :: WriterOptions
374− -> Alignment
375− -> [Block]
376− -> DokuWiki String
378+tableItemToDokuWiki :: PandocMonad m
379+ => WriterOptions
380+ -> Alignment
381+ -> [Block]
382+ -> DokuWiki m String
377383tableItemToDokuWiki opts align' item = do
378384 let mkcell x = (if align' == AlignRight || align' == AlignCenter
379385 then " "
@@ -386,9 +392,10 @@ tableItemToDokuWiki opts align' item = do
386392 return $ mkcell contents
387393
388394-- | Convert list of Pandoc block elements to DokuWiki.
389−blockListToDokuWiki :: WriterOptions -- ^ Options
395+blockListToDokuWiki :: PandocMonad m
396+ => WriterOptions -- ^ Options
390397 -> [Block] -- ^ List of block elements
391− -> DokuWiki String
398+ -> DokuWiki m String
392399blockListToDokuWiki opts blocks = do
393400 backSlash <- stBackSlashLB <$> ask
394401 let blocks' = consolidateRawBlocks blocks
@@ -403,12 +410,14 @@ consolidateRawBlocks (RawBlock f1 b1 : RawBlock f2 b2 : xs)
403410consolidateRawBlocks (x:xs) = x : consolidateRawBlocks xs
404411
405412-- | Convert list of Pandoc inline elements to DokuWiki.
406−inlineListToDokuWiki :: WriterOptions -> [Inline] -> DokuWiki String
413+inlineListToDokuWiki :: PandocMonad m
414+ => WriterOptions -> [Inline] -> DokuWiki m String
407415inlineListToDokuWiki opts lst =
408416 concat <$> (mapM (inlineToDokuWiki opts) lst)
409417
410418-- | Convert Pandoc inline element to DokuWiki.
411−inlineToDokuWiki :: WriterOptions -> Inline -> DokuWiki String
419+inlineToDokuWiki :: PandocMonad m
420+ => WriterOptions -> Inline -> DokuWiki m String
412421
413422inlineToDokuWiki opts (Span _attrs ils) =
414423 inlineListToDokuWiki opts ils
@@ -465,10 +474,10 @@ inlineToDokuWiki _ (Math mathType str) = return $ delim ++ str ++ delim
465474 DisplayMath -> "$$"
466475 InlineMath -> "$"
467476
468−inlineToDokuWiki _ (RawInline f str)
477+inlineToDokuWiki _ il@(RawInline f str)
469478 | f == Format "dokuwiki" = return str
470479 | f == Format "html" = return $ "<html>" ++ str ++ "</html>"
471− | otherwise = return ""
480+ | otherwise = "" <$ report (InlineNotRendered il)
472481
473482inlineToDokuWiki _ LineBreak = return "\\\\\n"
474483