MediaWiki writer: use PandocMonad.
This commit is contained in:
parent
2f8f8f0da6
commit
df7a443f67
1 changed files with 29 additions and 23 deletions
|
@ -35,7 +35,8 @@ import Control.Monad.State
|
||||||
import Data.List (intercalate)
|
import Data.List (intercalate)
|
||||||
import qualified Data.Set as Set
|
import qualified Data.Set as Set
|
||||||
import Network.URI (isURI)
|
import Network.URI (isURI)
|
||||||
import Text.Pandoc.Class (PandocMonad)
|
import Text.Pandoc.Class (PandocMonad, report)
|
||||||
|
import Text.Pandoc.Logging
|
||||||
import Text.Pandoc.Definition
|
import Text.Pandoc.Definition
|
||||||
import Text.Pandoc.ImageSize
|
import Text.Pandoc.ImageSize
|
||||||
import Text.Pandoc.Options
|
import Text.Pandoc.Options
|
||||||
|
@ -56,17 +57,17 @@ data WriterReader = WriterReader {
|
||||||
, useTags :: Bool -- True if we should use HTML tags because we're in a complex list
|
, useTags :: Bool -- True if we should use HTML tags because we're in a complex list
|
||||||
}
|
}
|
||||||
|
|
||||||
type MediaWikiWriter = ReaderT WriterReader (State WriterState)
|
type MediaWikiWriter m = ReaderT WriterReader (StateT WriterState m)
|
||||||
|
|
||||||
-- | Convert Pandoc to MediaWiki.
|
-- | Convert Pandoc to MediaWiki.
|
||||||
writeMediaWiki :: PandocMonad m => WriterOptions -> Pandoc -> m String
|
writeMediaWiki :: PandocMonad m => WriterOptions -> Pandoc -> m String
|
||||||
writeMediaWiki opts document = return $
|
writeMediaWiki opts document =
|
||||||
let initialState = WriterState { stNotes = False, stOptions = opts }
|
let initialState = WriterState { stNotes = False, stOptions = opts }
|
||||||
env = WriterReader { options = opts, listLevel = [], useTags = False }
|
env = WriterReader { options = opts, listLevel = [], useTags = False }
|
||||||
in evalState (runReaderT (pandocToMediaWiki document) env) initialState
|
in evalStateT (runReaderT (pandocToMediaWiki document) env) initialState
|
||||||
|
|
||||||
-- | Return MediaWiki representation of document.
|
-- | Return MediaWiki representation of document.
|
||||||
pandocToMediaWiki :: Pandoc -> MediaWikiWriter String
|
pandocToMediaWiki :: PandocMonad m => Pandoc -> MediaWikiWriter m String
|
||||||
pandocToMediaWiki (Pandoc meta blocks) = do
|
pandocToMediaWiki (Pandoc meta blocks) = do
|
||||||
opts <- asks options
|
opts <- asks options
|
||||||
metadata <- metaToJSON opts
|
metadata <- metaToJSON opts
|
||||||
|
@ -90,8 +91,9 @@ escapeString :: String -> String
|
||||||
escapeString = escapeStringForXML
|
escapeString = escapeStringForXML
|
||||||
|
|
||||||
-- | Convert Pandoc block element to MediaWiki.
|
-- | Convert Pandoc block element to MediaWiki.
|
||||||
blockToMediaWiki :: Block -- ^ Block element
|
blockToMediaWiki :: PandocMonad m
|
||||||
-> MediaWikiWriter String
|
=> Block -- ^ Block element
|
||||||
|
-> MediaWikiWriter m String
|
||||||
|
|
||||||
blockToMediaWiki Null = return ""
|
blockToMediaWiki Null = return ""
|
||||||
|
|
||||||
|
@ -125,10 +127,10 @@ blockToMediaWiki (Para inlines) = do
|
||||||
blockToMediaWiki (LineBlock lns) =
|
blockToMediaWiki (LineBlock lns) =
|
||||||
blockToMediaWiki $ linesToPara lns
|
blockToMediaWiki $ linesToPara lns
|
||||||
|
|
||||||
blockToMediaWiki (RawBlock f str)
|
blockToMediaWiki b@(RawBlock f str)
|
||||||
| f == Format "mediawiki" = return str
|
| f == Format "mediawiki" = return str
|
||||||
| f == Format "html" = return str
|
| f == Format "html" = return str
|
||||||
| otherwise = return ""
|
| otherwise = "" <$ report (BlockNotRendered b)
|
||||||
|
|
||||||
blockToMediaWiki HorizontalRule = return "\n-----\n"
|
blockToMediaWiki HorizontalRule = return "\n-----\n"
|
||||||
|
|
||||||
|
@ -212,7 +214,7 @@ listAttribsToString (startnum, numstyle, _) =
|
||||||
else "")
|
else "")
|
||||||
|
|
||||||
-- | Convert bullet or ordered list item (list of blocks) to MediaWiki.
|
-- | Convert bullet or ordered list item (list of blocks) to MediaWiki.
|
||||||
listItemToMediaWiki :: [Block] -> MediaWikiWriter String
|
listItemToMediaWiki :: PandocMonad m => [Block] -> MediaWikiWriter m String
|
||||||
listItemToMediaWiki items = do
|
listItemToMediaWiki items = do
|
||||||
contents <- blockListToMediaWiki items
|
contents <- blockListToMediaWiki items
|
||||||
tags <- asks useTags
|
tags <- asks useTags
|
||||||
|
@ -223,8 +225,9 @@ listItemToMediaWiki items = do
|
||||||
return $ marker ++ " " ++ contents
|
return $ marker ++ " " ++ contents
|
||||||
|
|
||||||
-- | Convert definition list item (label, list of blocks) to MediaWiki.
|
-- | Convert definition list item (label, list of blocks) to MediaWiki.
|
||||||
definitionListItemToMediaWiki :: ([Inline],[[Block]])
|
definitionListItemToMediaWiki :: PandocMonad m
|
||||||
-> MediaWikiWriter String
|
=> ([Inline],[[Block]])
|
||||||
|
-> MediaWikiWriter m String
|
||||||
definitionListItemToMediaWiki (label, items) = do
|
definitionListItemToMediaWiki (label, items) = do
|
||||||
labelText <- inlineListToMediaWiki label
|
labelText <- inlineListToMediaWiki label
|
||||||
contents <- mapM blockListToMediaWiki items
|
contents <- mapM blockListToMediaWiki items
|
||||||
|
@ -278,20 +281,22 @@ vcat = intercalate "\n"
|
||||||
|
|
||||||
-- Auxiliary functions for tables:
|
-- Auxiliary functions for tables:
|
||||||
|
|
||||||
tableRowToMediaWiki :: Bool
|
tableRowToMediaWiki :: PandocMonad m
|
||||||
|
=> Bool
|
||||||
-> [Alignment]
|
-> [Alignment]
|
||||||
-> [Double]
|
-> [Double]
|
||||||
-> (Int, [[Block]])
|
-> (Int, [[Block]])
|
||||||
-> MediaWikiWriter String
|
-> MediaWikiWriter m String
|
||||||
tableRowToMediaWiki headless alignments widths (rownum, cells) = do
|
tableRowToMediaWiki headless alignments widths (rownum, cells) = do
|
||||||
cells' <- mapM (tableCellToMediaWiki headless rownum)
|
cells' <- mapM (tableCellToMediaWiki headless rownum)
|
||||||
$ zip3 alignments widths cells
|
$ zip3 alignments widths cells
|
||||||
return $ unlines cells'
|
return $ unlines cells'
|
||||||
|
|
||||||
tableCellToMediaWiki :: Bool
|
tableCellToMediaWiki :: PandocMonad m
|
||||||
|
=> Bool
|
||||||
-> Int
|
-> Int
|
||||||
-> (Alignment, Double, [Block])
|
-> (Alignment, Double, [Block])
|
||||||
-> MediaWikiWriter String
|
-> MediaWikiWriter m String
|
||||||
tableCellToMediaWiki headless rownum (alignment, width, bs) = do
|
tableCellToMediaWiki headless rownum (alignment, width, bs) = do
|
||||||
contents <- blockListToMediaWiki bs
|
contents <- blockListToMediaWiki bs
|
||||||
let marker = if rownum == 1 && not headless then "!" else "|"
|
let marker = if rownum == 1 && not headless then "!" else "|"
|
||||||
|
@ -316,7 +321,7 @@ alignmentToString alignment = case alignment of
|
||||||
AlignCenter -> "center"
|
AlignCenter -> "center"
|
||||||
AlignDefault -> "left"
|
AlignDefault -> "left"
|
||||||
|
|
||||||
imageToMediaWiki :: Attr -> MediaWikiWriter String
|
imageToMediaWiki :: PandocMonad m => Attr -> MediaWikiWriter m String
|
||||||
imageToMediaWiki attr = do
|
imageToMediaWiki attr = do
|
||||||
opts <- gets stOptions
|
opts <- gets stOptions
|
||||||
let (_, cls, _) = attr
|
let (_, cls, _) = attr
|
||||||
|
@ -334,18 +339,19 @@ imageToMediaWiki attr = do
|
||||||
return $ dims ++ classes
|
return $ dims ++ classes
|
||||||
|
|
||||||
-- | Convert list of Pandoc block elements to MediaWiki.
|
-- | Convert list of Pandoc block elements to MediaWiki.
|
||||||
blockListToMediaWiki :: [Block] -- ^ List of block elements
|
blockListToMediaWiki :: PandocMonad m
|
||||||
-> MediaWikiWriter String
|
=> [Block] -- ^ List of block elements
|
||||||
|
-> MediaWikiWriter m String
|
||||||
blockListToMediaWiki blocks =
|
blockListToMediaWiki blocks =
|
||||||
fmap vcat $ mapM blockToMediaWiki blocks
|
fmap vcat $ mapM blockToMediaWiki blocks
|
||||||
|
|
||||||
-- | Convert list of Pandoc inline elements to MediaWiki.
|
-- | Convert list of Pandoc inline elements to MediaWiki.
|
||||||
inlineListToMediaWiki :: [Inline] -> MediaWikiWriter String
|
inlineListToMediaWiki :: PandocMonad m => [Inline] -> MediaWikiWriter m String
|
||||||
inlineListToMediaWiki lst =
|
inlineListToMediaWiki lst =
|
||||||
fmap concat $ mapM inlineToMediaWiki lst
|
fmap concat $ mapM inlineToMediaWiki lst
|
||||||
|
|
||||||
-- | Convert Pandoc inline element to MediaWiki.
|
-- | Convert Pandoc inline element to MediaWiki.
|
||||||
inlineToMediaWiki :: Inline -> MediaWikiWriter String
|
inlineToMediaWiki :: PandocMonad m => Inline -> MediaWikiWriter m String
|
||||||
|
|
||||||
inlineToMediaWiki (Span attrs ils) = do
|
inlineToMediaWiki (Span attrs ils) = do
|
||||||
contents <- inlineListToMediaWiki ils
|
contents <- inlineListToMediaWiki ils
|
||||||
|
@ -394,10 +400,10 @@ inlineToMediaWiki (Math mt str) = return $
|
||||||
"\">" ++ str ++ "</math>"
|
"\">" ++ str ++ "</math>"
|
||||||
-- note: str should NOT be escaped
|
-- note: str should NOT be escaped
|
||||||
|
|
||||||
inlineToMediaWiki (RawInline f str)
|
inlineToMediaWiki il@(RawInline f str)
|
||||||
| f == Format "mediawiki" = return str
|
| f == Format "mediawiki" = return str
|
||||||
| f == Format "html" = return str
|
| f == Format "html" = return str
|
||||||
| otherwise = return ""
|
| otherwise = "" <$ report (InlineNotRendered il)
|
||||||
|
|
||||||
inlineToMediaWiki LineBreak = return "<br />\n"
|
inlineToMediaWiki LineBreak = return "<br />\n"
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue