git.iko.soy/typeable/pandoc
on master help sign in
MediaWiki writer: use PandocMonad.
commitdf7a443f672bf92d2821c494d20bf510f238d7f8 authorJohn MacFarlane <jgm@berkeley.edu> dateSun 12 Mar 2017, 23:09 (10 years ago) parent2f8f8f0
1 file changed+29−23
src/Text/Pandoc/Writers/MediaWiki.hs+29−23
src/Text/Pandoc/Writers/MediaWiki.hs+29−23
@@ -35,7 +35,8 @@ import Control.Monad.State
3535import Data.List (intercalate)
3636import qualified Data.Set as Set
3737import Network.URI (isURI)
38−import Text.Pandoc.Class (PandocMonad)
38+import Text.Pandoc.Class (PandocMonad, report)
39+import Text.Pandoc.Logging
3940import Text.Pandoc.Definition
4041import Text.Pandoc.ImageSize
4142import Text.Pandoc.Options
@@ -56,17 +57,17 @@ data WriterReader = WriterReader {
5657 , useTags :: Bool -- True if we should use HTML tags because we're in a complex list
5758 }
5859
59−type MediaWikiWriter = ReaderT WriterReader (State WriterState)
60+type MediaWikiWriter m = ReaderT WriterReader (StateT WriterState m)
6061
6162-- | Convert Pandoc to MediaWiki.
6263writeMediaWiki :: PandocMonad m => WriterOptions -> Pandoc -> m String
63−writeMediaWiki opts document = return $
64+writeMediaWiki opts document =
6465 let initialState = WriterState { stNotes = False, stOptions = opts }
6566 env = WriterReader { options = opts, listLevel = [], useTags = False }
66− in evalState (runReaderT (pandocToMediaWiki document) env) initialState
67+ in evalStateT (runReaderT (pandocToMediaWiki document) env) initialState
6768
6869-- | Return MediaWiki representation of document.
69−pandocToMediaWiki :: Pandoc -> MediaWikiWriter String
70+pandocToMediaWiki :: PandocMonad m => Pandoc -> MediaWikiWriter m String
7071pandocToMediaWiki (Pandoc meta blocks) = do
7172 opts <- asks options
7273 metadata <- metaToJSON opts
@@ -90,8 +91,9 @@ escapeString :: String -> String
9091escapeString = escapeStringForXML
9192
9293-- | Convert Pandoc block element to MediaWiki.
93−blockToMediaWiki :: Block -- ^ Block element
94− -> MediaWikiWriter String
94+blockToMediaWiki :: PandocMonad m
95+ => Block -- ^ Block element
96+ -> MediaWikiWriter m String
9597
9698blockToMediaWiki Null = return ""
9799
@@ -125,10 +127,10 @@ blockToMediaWiki (Para inlines) = do
125127blockToMediaWiki (LineBlock lns) =
126128 blockToMediaWiki $ linesToPara lns
127129
128−blockToMediaWiki (RawBlock f str)
130+blockToMediaWiki b@(RawBlock f str)
129131 | f == Format "mediawiki" = return str
130132 | f == Format "html" = return str
131− | otherwise = return ""
133+ | otherwise = "" <$ report (BlockNotRendered b)
132134
133135blockToMediaWiki HorizontalRule = return "\n-----\n"
134136
@@ -212,7 +214,7 @@ listAttribsToString (startnum, numstyle, _) =
212214 else "")
213215
214216-- | Convert bullet or ordered list item (list of blocks) to MediaWiki.
215−listItemToMediaWiki :: [Block] -> MediaWikiWriter String
217+listItemToMediaWiki :: PandocMonad m => [Block] -> MediaWikiWriter m String
216218listItemToMediaWiki items = do
217219 contents <- blockListToMediaWiki items
218220 tags <- asks useTags
@@ -223,8 +225,9 @@ listItemToMediaWiki items = do
223225 return $ marker ++ " " ++ contents
224226
225227-- | Convert definition list item (label, list of blocks) to MediaWiki.
226−definitionListItemToMediaWiki :: ([Inline],[[Block]])
227− -> MediaWikiWriter String
228+definitionListItemToMediaWiki :: PandocMonad m
229+ => ([Inline],[[Block]])
230+ -> MediaWikiWriter m String
228231definitionListItemToMediaWiki (label, items) = do
229232 labelText <- inlineListToMediaWiki label
230233 contents <- mapM blockListToMediaWiki items
@@ -278,20 +281,22 @@ vcat = intercalate "\n"
278281
279282-- Auxiliary functions for tables:
280283
281−tableRowToMediaWiki :: Bool
284+tableRowToMediaWiki :: PandocMonad m
285+ => Bool
282286 -> [Alignment]
283287 -> [Double]
284288 -> (Int, [[Block]])
285− -> MediaWikiWriter String
289+ -> MediaWikiWriter m String
286290tableRowToMediaWiki headless alignments widths (rownum, cells) = do
287291 cells' <- mapM (tableCellToMediaWiki headless rownum)
288292 $ zip3 alignments widths cells
289293 return $ unlines cells'
290294
291−tableCellToMediaWiki :: Bool
295+tableCellToMediaWiki :: PandocMonad m
296+ => Bool
292297 -> Int
293298 -> (Alignment, Double, [Block])
294− -> MediaWikiWriter String
299+ -> MediaWikiWriter m String
295300tableCellToMediaWiki headless rownum (alignment, width, bs) = do
296301 contents <- blockListToMediaWiki bs
297302 let marker = if rownum == 1 && not headless then "!" else "|"
@@ -316,7 +321,7 @@ alignmentToString alignment = case alignment of
316321 AlignCenter -> "center"
317322 AlignDefault -> "left"
318323
319−imageToMediaWiki :: Attr -> MediaWikiWriter String
324+imageToMediaWiki :: PandocMonad m => Attr -> MediaWikiWriter m String
320325imageToMediaWiki attr = do
321326 opts <- gets stOptions
322327 let (_, cls, _) = attr
@@ -334,18 +339,19 @@ imageToMediaWiki attr = do
334339 return $ dims ++ classes
335340
336341-- | Convert list of Pandoc block elements to MediaWiki.
337−blockListToMediaWiki :: [Block] -- ^ List of block elements
338− -> MediaWikiWriter String
342+blockListToMediaWiki :: PandocMonad m
343+ => [Block] -- ^ List of block elements
344+ -> MediaWikiWriter m String
339345blockListToMediaWiki blocks =
340346 fmap vcat $ mapM blockToMediaWiki blocks
341347
342348-- | Convert list of Pandoc inline elements to MediaWiki.
343−inlineListToMediaWiki :: [Inline] -> MediaWikiWriter String
349+inlineListToMediaWiki :: PandocMonad m => [Inline] -> MediaWikiWriter m String
344350inlineListToMediaWiki lst =
345351 fmap concat $ mapM inlineToMediaWiki lst
346352
347353-- | Convert Pandoc inline element to MediaWiki.
348−inlineToMediaWiki :: Inline -> MediaWikiWriter String
354+inlineToMediaWiki :: PandocMonad m => Inline -> MediaWikiWriter m String
349355
350356inlineToMediaWiki (Span attrs ils) = do
351357 contents <- inlineListToMediaWiki ils
@@ -394,10 +400,10 @@ inlineToMediaWiki (Math mt str) = return $
394400 "\">" ++ str ++ "</math>"
395401 -- note: str should NOT be escaped
396402
397−inlineToMediaWiki (RawInline f str)
403+inlineToMediaWiki il@(RawInline f str)
398404 | f == Format "mediawiki" = return str
399405 | f == Format "html" = return str
400− | otherwise = return ""
406+ | otherwise = "" <$ report (InlineNotRendered il)
401407
402408inlineToMediaWiki LineBreak = return "<br />\n"
403409