git.iko.soy/typeable/pandoc
on master help sign in
Converted DokuWiki writer to use PandocMonad.
1012e66John MacFarlane
src/Text/Pandoc/Writers/DokuWiki.hs+34−25
@@ -41,11 +41,12 @@ DokuWiki: <https://www.dokuwiki.org/dokuwiki>
41module Text.Pandoc.Writers.DokuWiki ( writeDokuWiki ) where
41module Text.Pandoc.Writers.DokuWiki ( writeDokuWiki ) where
42import Control.Monad (zipWithM)
42import Control.Monad (zipWithM)
43import Control.Monad.Reader (ReaderT, ask, local, runReaderT)
43import 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)
45import Data.Default (Default (..))
45import Data.Default (Default (..))
46import Data.List (intercalate, intersect, isPrefixOf, transpose)
46import Data.List (intercalate, intersect, isPrefixOf, transpose)
47import Network.URI (isURI)
47import Network.URI (isURI)
48−import Text.Pandoc.Class (PandocMonad)
48+import Text.Pandoc.Class (PandocMonad, report)
49+import Text.Pandoc.Logging
49import Text.Pandoc.Definition
50import Text.Pandoc.Definition
50import Text.Pandoc.ImageSize
51import Text.Pandoc.ImageSize
51import Text.Pandoc.Options (WrapOption (..), WriterOptions (writerTableOfContents, writerTemplate, writerWrapText))
52import Text.Pandoc.Options (WrapOption (..), WriterOptions (writerTableOfContents, writerTemplate, writerWrapText))
@@ -72,18 +73,19 @@ instance Default WriterEnvironment where
72 , stUseTags = False
73 , stUseTags = False
73 , stBackSlashLB = False }
74 , stBackSlashLB = False }
74
75
75−type DokuWiki = ReaderT WriterEnvironment (State WriterState)
76+type DokuWiki m = ReaderT WriterEnvironment (StateT WriterState m)
76
77
77-- | Convert Pandoc to DokuWiki.
78-- | Convert Pandoc to DokuWiki.
78writeDokuWiki :: PandocMonad m => WriterOptions -> Pandoc -> m String
79writeDokuWiki :: PandocMonad m => WriterOptions -> Pandoc -> m String
79−writeDokuWiki opts document = return $
80+writeDokuWiki opts document =
80 runDokuWiki (pandocToDokuWiki opts document)
81 runDokuWiki (pandocToDokuWiki opts document)
81
82
82−runDokuWiki :: DokuWiki a -> a
83+runDokuWiki :: PandocMonad m => DokuWiki m a -> m a
83−runDokuWiki = flip evalState def . flip runReaderT def
84+runDokuWiki = flip evalStateT def . flip runReaderT def
84
85
85-- | Return DokuWiki representation of document.
86-- | Return DokuWiki representation of document.
87+pandocToDokuWiki :: PandocMonad m
86−pandocToDokuWiki :: WriterOptions -> Pandoc -> DokuWiki String
88+ => WriterOptions -> Pandoc -> DokuWiki m String
87pandocToDokuWiki opts (Pandoc meta blocks) = do
89pandocToDokuWiki opts (Pandoc meta blocks) = do
88 metadata <- metaToJSON opts
90 metadata <- metaToJSON opts
89 (fmap trimr . blockListToDokuWiki opts)
91 (fmap trimr . blockListToDokuWiki opts)
@@ -110,9 +112,10 @@ escapeString = substitute "__" "%%__%%" .
110 substitute "//" "%%//%%"
112 substitute "//" "%%//%%"
111
113
112-- | Convert Pandoc block element to DokuWiki.
114-- | Convert Pandoc block element to DokuWiki.
115+blockToDokuWiki :: PandocMonad m
113−blockToDokuWiki :: WriterOptions -- ^ Options
116+ => WriterOptions -- ^ Options
114 -> Block -- ^ Block element
117 -> Block -- ^ Block element
115− -> DokuWiki String
118+ -> DokuWiki m String
116
119
117blockToDokuWiki _ Null = return ""
120blockToDokuWiki _ Null = return ""
118
121
@@ -147,12 +150,12 @@ blockToDokuWiki opts (Para inlines) = do
147blockToDokuWiki opts (LineBlock lns) =
150blockToDokuWiki opts (LineBlock lns) =
148 blockToDokuWiki opts $ linesToPara lns
151 blockToDokuWiki opts $ linesToPara lns
149
152
150−blockToDokuWiki _ (RawBlock f str)
153+blockToDokuWiki _ b@(RawBlock f str)
151 | f == Format "dokuwiki" = return str
154 | f == Format "dokuwiki" = return str
152 -- See https://www.dokuwiki.org/wiki:syntax
155 -- See https://www.dokuwiki.org/wiki:syntax
153 -- use uppercase HTML tag for block-level content:
156 -- use uppercase HTML tag for block-level content:
154 | f == Format "html" = return $ "<HTML>\n" ++ str ++ "\n</HTML>"
157 | f == Format "html" = return $ "<HTML>\n" ++ str ++ "\n</HTML>"
155− | otherwise = return ""
158+ | otherwise = "" <$ (report $ BlockNotRendered b)
156
159
157blockToDokuWiki _ HorizontalRule = return "\n----\n"
160blockToDokuWiki _ HorizontalRule = return "\n----\n"
158
161
@@ -276,7 +279,8 @@ listAttribsToString (startnum, numstyle, _) =
276 else "")
279 else "")
277
280
278-- | Convert bullet list item (list of blocks) to DokuWiki.
281-- | Convert bullet list item (list of blocks) to DokuWiki.
282+listItemToDokuWiki :: PandocMonad m
279−listItemToDokuWiki :: WriterOptions -> [Block] -> DokuWiki String
283+ => WriterOptions -> [Block] -> DokuWiki m String
280listItemToDokuWiki opts items = do
284listItemToDokuWiki opts items = do
281 contents <- blockListToDokuWiki opts items
285 contents <- blockListToDokuWiki opts items
282 useTags <- stUseTags <$> ask
286 useTags <- stUseTags <$> ask
@@ -290,7 +294,7 @@ listItemToDokuWiki opts items = do
290
294
291-- | Convert ordered list item (list of blocks) to DokuWiki.
295-- | Convert ordered list item (list of blocks) to DokuWiki.
292-- | TODO Emiminate dreadful duplication of text from listItemToDokuWiki
296-- | TODO Emiminate dreadful duplication of text from listItemToDokuWiki
293−orderedListItemToDokuWiki :: WriterOptions -> [Block] -> DokuWiki String
297+orderedListItemToDokuWiki :: PandocMonad m => WriterOptions -> [Block] -> DokuWiki m String
294orderedListItemToDokuWiki opts items = do
298orderedListItemToDokuWiki opts items = do
295 contents <- blockListToDokuWiki opts items
299 contents <- blockListToDokuWiki opts items
296 useTags <- stUseTags <$> ask
300 useTags <- stUseTags <$> ask
@@ -303,9 +307,10 @@ orderedListItemToDokuWiki opts items = do
303 return $ indent' ++ "- " ++ contents
307 return $ indent' ++ "- " ++ contents
304
308
305-- | Convert definition list item (label, list of blocks) to DokuWiki.
309-- | Convert definition list item (label, list of blocks) to DokuWiki.
306−definitionListItemToDokuWiki :: WriterOptions
310+definitionListItemToDokuWiki :: PandocMonad m
311+ => WriterOptions
307 -> ([Inline],[[Block]])
312 -> ([Inline],[[Block]])
308− -> DokuWiki String
313+ -> DokuWiki m String
309definitionListItemToDokuWiki opts (label, items) = do
314definitionListItemToDokuWiki opts (label, items) = do
310 labelText <- inlineListToDokuWiki opts label
315 labelText <- inlineListToDokuWiki opts label
311 contents <- mapM (blockListToDokuWiki opts) items
316 contents <- mapM (blockListToDokuWiki opts) items
@@ -370,10 +375,11 @@ backSlashLineBreaks cs = reverse $ g $ reverse $ concatMap f cs
370
375
371-- Auxiliary functions for tables:
376-- Auxiliary functions for tables:
372
377
373−tableItemToDokuWiki :: WriterOptions
378+tableItemToDokuWiki :: PandocMonad m
379+ => WriterOptions
374− -> Alignment
380+ -> Alignment
375− -> [Block]
381+ -> [Block]
376− -> DokuWiki String
382+ -> DokuWiki m String
377tableItemToDokuWiki opts align' item = do
383tableItemToDokuWiki opts align' item = do
378 let mkcell x = (if align' == AlignRight || align' == AlignCenter
384 let mkcell x = (if align' == AlignRight || align' == AlignCenter
379 then " "
385 then " "
@@ -386,9 +392,10 @@ tableItemToDokuWiki opts align' item = do
386 return $ mkcell contents
392 return $ mkcell contents
387
393
388-- | Convert list of Pandoc block elements to DokuWiki.
394-- | Convert list of Pandoc block elements to DokuWiki.
395+blockListToDokuWiki :: PandocMonad m
389−blockListToDokuWiki :: WriterOptions -- ^ Options
396+ => WriterOptions -- ^ Options
390 -> [Block] -- ^ List of block elements
397 -> [Block] -- ^ List of block elements
391− -> DokuWiki String
398+ -> DokuWiki m String
392blockListToDokuWiki opts blocks = do
399blockListToDokuWiki opts blocks = do
393 backSlash <- stBackSlashLB <$> ask
400 backSlash <- stBackSlashLB <$> ask
394 let blocks' = consolidateRawBlocks blocks
401 let blocks' = consolidateRawBlocks blocks
@@ -403,12 +410,14 @@ consolidateRawBlocks (RawBlock f1 b1 : RawBlock f2 b2 : xs)
403consolidateRawBlocks (x:xs) = x : consolidateRawBlocks xs
410consolidateRawBlocks (x:xs) = x : consolidateRawBlocks xs
404
411
405-- | Convert list of Pandoc inline elements to DokuWiki.
412-- | Convert list of Pandoc inline elements to DokuWiki.
413+inlineListToDokuWiki :: PandocMonad m
406−inlineListToDokuWiki :: WriterOptions -> [Inline] -> DokuWiki String
414+ => WriterOptions -> [Inline] -> DokuWiki m String
407inlineListToDokuWiki opts lst =
415inlineListToDokuWiki opts lst =
408 concat <$> (mapM (inlineToDokuWiki opts) lst)
416 concat <$> (mapM (inlineToDokuWiki opts) lst)
409
417
410-- | Convert Pandoc inline element to DokuWiki.
418-- | Convert Pandoc inline element to DokuWiki.
419+inlineToDokuWiki :: PandocMonad m
411−inlineToDokuWiki :: WriterOptions -> Inline -> DokuWiki String
420+ => WriterOptions -> Inline -> DokuWiki m String
412
421
413inlineToDokuWiki opts (Span _attrs ils) =
422inlineToDokuWiki opts (Span _attrs ils) =
414 inlineListToDokuWiki opts ils
423 inlineListToDokuWiki opts ils
@@ -465,10 +474,10 @@ inlineToDokuWiki _ (Math mathType str) = return $ delim ++ str ++ delim
465 DisplayMath -> "$$"
474 DisplayMath -> "$$"
466 InlineMath -> "$"
475 InlineMath -> "$"
467
476
468−inlineToDokuWiki _ (RawInline f str)
477+inlineToDokuWiki _ il@(RawInline f str)
469 | f == Format "dokuwiki" = return str
478 | f == Format "dokuwiki" = return str
470 | f == Format "html" = return $ "<html>" ++ str ++ "</html>"
479 | f == Format "html" = return $ "<html>" ++ str ++ "</html>"
471− | otherwise = return ""
480+ | otherwise = "" <$ report (InlineNotRendered il)
472
481
473inlineToDokuWiki _ LineBreak = return "\\\\\n"
482inlineToDokuWiki _ LineBreak = return "\\\\\n"
474
483