@@ -35,7 +35,8 @@ import Control.Monad.State
35import Data.List (intercalate)
35import Data.List (intercalate)
36import qualified Data.Set as Set
36import qualified Data.Set as Set
37import Network.URI (isURI)
37import Network.URI (isURI)
38−import Text.Pandoc.Class (PandocMonad)
38+import Text.Pandoc.Class (PandocMonad, report)
39+import Text.Pandoc.Logging
39import Text.Pandoc.Definition
40import Text.Pandoc.Definition
40import Text.Pandoc.ImageSize
41import Text.Pandoc.ImageSize
41import Text.Pandoc.Options
42import Text.Pandoc.Options
@@ -56,17 +57,17 @@ data WriterReader = WriterReader {
56 , useTags :: Bool -- True if we should use HTML tags because we're in a complex list
57 , useTags :: Bool -- True if we should use HTML tags because we're in a complex list
59−type MediaWikiWriter = ReaderT WriterReader (State WriterState)
60+type MediaWikiWriter m = ReaderT WriterReader (StateT WriterState m)
61-- | Convert Pandoc to MediaWiki.
62-- | Convert Pandoc to MediaWiki.
62writeMediaWiki :: PandocMonad m => WriterOptions -> Pandoc -> m String
63writeMediaWiki :: PandocMonad m => WriterOptions -> Pandoc -> m String
63−writeMediaWiki opts document = return $
64+writeMediaWiki opts document =
64 let initialState = WriterState { stNotes = False, stOptions = opts }
65 let initialState = WriterState { stNotes = False, stOptions = opts }
65 env = WriterReader { options = opts, listLevel = [], useTags = False }
66 env = WriterReader { options = opts, listLevel = [], useTags = False }
66− in evalState (runReaderT (pandocToMediaWiki document) env) initialState
67+ in evalStateT (runReaderT (pandocToMediaWiki document) env) initialState
68-- | Return MediaWiki representation of document.
69-- | Return MediaWiki representation of document.
69−pandocToMediaWiki :: Pandoc -> MediaWikiWriter String
70+pandocToMediaWiki :: PandocMonad m => Pandoc -> MediaWikiWriter m String
70pandocToMediaWiki (Pandoc meta blocks) = do
71pandocToMediaWiki (Pandoc meta blocks) = do
71 opts <- asks options
72 opts <- asks options
72 metadata <- metaToJSON opts
73 metadata <- metaToJSON opts
@@ -90,8 +91,9 @@ escapeString :: String -> String
90escapeString = escapeStringForXML
91escapeString = escapeStringForXML
92-- | Convert Pandoc block element to MediaWiki.
93-- | Convert Pandoc block element to MediaWiki.
94+blockToMediaWiki :: PandocMonad m
93−blockToMediaWiki :: Block -- ^ Block element
95+ => Block -- ^ Block element
94− -> MediaWikiWriter String
96+ -> MediaWikiWriter m String
96blockToMediaWiki Null = return ""
98blockToMediaWiki Null = return ""
@@ -125,10 +127,10 @@ blockToMediaWiki (Para inlines) = do
125blockToMediaWiki (LineBlock lns) =
127blockToMediaWiki (LineBlock lns) =
126 blockToMediaWiki $ linesToPara lns
128 blockToMediaWiki $ linesToPara lns
128−blockToMediaWiki (RawBlock f str)
130+blockToMediaWiki b@(RawBlock f str)
129 | f == Format "mediawiki" = return str
131 | f == Format "mediawiki" = return str
130 | f == Format "html" = return str
132 | f == Format "html" = return str
131− | otherwise = return ""
133+ | otherwise = "" <$ report (BlockNotRendered b)
133blockToMediaWiki HorizontalRule = return "\n-----\n"
135blockToMediaWiki HorizontalRule = return "\n-----\n"
@@ -212,7 +214,7 @@ listAttribsToString (startnum, numstyle, _) =
214-- | Convert bullet or ordered list item (list of blocks) to MediaWiki.
216-- | Convert bullet or ordered list item (list of blocks) to MediaWiki.
215−listItemToMediaWiki :: [Block] -> MediaWikiWriter String
217+listItemToMediaWiki :: PandocMonad m => [Block] -> MediaWikiWriter m String
216listItemToMediaWiki items = do
218listItemToMediaWiki items = do
217 contents <- blockListToMediaWiki items
219 contents <- blockListToMediaWiki items
218 tags <- asks useTags
220 tags <- asks useTags
@@ -223,8 +225,9 @@ listItemToMediaWiki items = do
223 return $ marker ++ " " ++ contents
225 return $ marker ++ " " ++ contents
225-- | Convert definition list item (label, list of blocks) to MediaWiki.
227-- | Convert definition list item (label, list of blocks) to MediaWiki.
226−definitionListItemToMediaWiki :: ([Inline],[[Block]])
228+definitionListItemToMediaWiki :: PandocMonad m
229+ => ([Inline],[[Block]])
227− -> MediaWikiWriter String
230+ -> MediaWikiWriter m String
228definitionListItemToMediaWiki (label, items) = do
231definitionListItemToMediaWiki (label, items) = do
229 labelText <- inlineListToMediaWiki label
232 labelText <- inlineListToMediaWiki label
230 contents <- mapM blockListToMediaWiki items
233 contents <- mapM blockListToMediaWiki items
@@ -278,20 +281,22 @@ vcat = intercalate "\n"
279-- Auxiliary functions for tables:
282-- Auxiliary functions for tables:
281−tableRowToMediaWiki :: Bool
284+tableRowToMediaWiki :: PandocMonad m
282 -> [Alignment]
286 -> [Alignment]
283 -> [Double]
287 -> [Double]
284 -> (Int, [[Block]])
288 -> (Int, [[Block]])
285− -> MediaWikiWriter String
289+ -> MediaWikiWriter m String
286tableRowToMediaWiki headless alignments widths (rownum, cells) = do
290tableRowToMediaWiki headless alignments widths (rownum, cells) = do
287 cells' <- mapM (tableCellToMediaWiki headless rownum)
291 cells' <- mapM (tableCellToMediaWiki headless rownum)
288 $ zip3 alignments widths cells
292 $ zip3 alignments widths cells
289 return $ unlines cells'
293 return $ unlines cells'
291−tableCellToMediaWiki :: Bool
295+tableCellToMediaWiki :: PandocMonad m
293 -> (Alignment, Double, [Block])
298 -> (Alignment, Double, [Block])
294− -> MediaWikiWriter String
299+ -> MediaWikiWriter m String
295tableCellToMediaWiki headless rownum (alignment, width, bs) = do
300tableCellToMediaWiki headless rownum (alignment, width, bs) = do
296 contents <- blockListToMediaWiki bs
301 contents <- blockListToMediaWiki bs
297 let marker = if rownum == 1 && not headless then "!" else "|"
302 let marker = if rownum == 1 && not headless then "!" else "|"
@@ -316,7 +321,7 @@ alignmentToString alignment = case alignment of
316 AlignCenter -> "center"
321 AlignCenter -> "center"
317 AlignDefault -> "left"
322 AlignDefault -> "left"
319−imageToMediaWiki :: Attr -> MediaWikiWriter String
324+imageToMediaWiki :: PandocMonad m => Attr -> MediaWikiWriter m String
320imageToMediaWiki attr = do
325imageToMediaWiki attr = do
321 opts <- gets stOptions
326 opts <- gets stOptions
322 let (_, cls, _) = attr
327 let (_, cls, _) = attr
@@ -334,18 +339,19 @@ imageToMediaWiki attr = do
334 return $ dims ++ classes
339 return $ dims ++ classes
336-- | Convert list of Pandoc block elements to MediaWiki.
341-- | Convert list of Pandoc block elements to MediaWiki.
342+blockListToMediaWiki :: PandocMonad m
337−blockListToMediaWiki :: [Block] -- ^ List of block elements
343+ => [Block] -- ^ List of block elements
338− -> MediaWikiWriter String
344+ -> MediaWikiWriter m String
339blockListToMediaWiki blocks =
345blockListToMediaWiki blocks =
340 fmap vcat $ mapM blockToMediaWiki blocks
346 fmap vcat $ mapM blockToMediaWiki blocks
342-- | Convert list of Pandoc inline elements to MediaWiki.
348-- | Convert list of Pandoc inline elements to MediaWiki.
343−inlineListToMediaWiki :: [Inline] -> MediaWikiWriter String
349+inlineListToMediaWiki :: PandocMonad m => [Inline] -> MediaWikiWriter m String
344inlineListToMediaWiki lst =
350inlineListToMediaWiki lst =
345 fmap concat $ mapM inlineToMediaWiki lst
351 fmap concat $ mapM inlineToMediaWiki lst
347-- | Convert Pandoc inline element to MediaWiki.
353-- | Convert Pandoc inline element to MediaWiki.
348−inlineToMediaWiki :: Inline -> MediaWikiWriter String
354+inlineToMediaWiki :: PandocMonad m => Inline -> MediaWikiWriter m String
350inlineToMediaWiki (Span attrs ils) = do
356inlineToMediaWiki (Span attrs ils) = do
351 contents <- inlineListToMediaWiki ils
357 contents <- inlineListToMediaWiki ils
@@ -394,10 +400,10 @@ inlineToMediaWiki (Math mt str) = return $
394 "\">" ++ str ++ "</math>"
400 "\">" ++ str ++ "</math>"
395 -- note: str should NOT be escaped
401 -- note: str should NOT be escaped
397−inlineToMediaWiki (RawInline f str)
403+inlineToMediaWiki il@(RawInline f str)
398 | f == Format "mediawiki" = return str
404 | f == Format "mediawiki" = return str
399 | f == Format "html" = return str
405 | f == Format "html" = return str
400− | otherwise = return ""
406+ | otherwise = "" <$ report (InlineNotRendered il)
402inlineToMediaWiki LineBreak = return "<br />\n"
408inlineToMediaWiki LineBreak = return "<br />\n"