diff --git a/src/Text/Pandoc/Readers/MediaWiki.hs b/src/Text/Pandoc/Readers/MediaWiki.hs
index b7460b82e..1112007c6 100644
--- a/src/Text/Pandoc/Readers/MediaWiki.hs
+++ b/src/Text/Pandoc/Readers/MediaWiki.hs
@@ -55,6 +55,7 @@ readMediaWiki opts s = do
, mwIdentifierList = Set.empty
, mwLogMessages = []
, mwInTT = False
+ , mwAllowNewlines = True
}
sources
case parsed of
@@ -68,6 +69,7 @@ data MWState = MWState { mwOptions :: ReaderOptions
, mwIdentifierList :: Set.Set Text
, mwLogMessages :: [LogMessage]
, mwInTT :: Bool
+ , mwAllowNewlines :: Bool
}
type MWParser m = ParsecT Sources MWState m
@@ -453,9 +455,8 @@ defListTerm = do
guardColumnOne
char ';'
skipMany spaceChar
- pos' <- getPosition
- anyLine >>= parseFromString (do setPosition pos'
- trimInlines . mconcat <$> many inline)
+ trimInlines . mconcat <$> many (notFollowedBy (oneOf ":\r\n") *> inline) <*
+ optional newline
listStart :: PandocMonad m => Char -> MWParser m ()
listStart c = char c *> notFollowedBy listStartChar
@@ -472,7 +473,7 @@ li = lookAhead (htmlTag (~== TagOpen ("li" :: Text) [])) *>
listItem :: PandocMonad m => Char -> MWParser m Blocks
listItem c = try $ do
- guardColumnOne
+ guardColumnOne <|> guard (c == ':') -- def can start on same line as term
extras <- many (try $ char c <* lookAhead listStartChar)
if null extras
then listItem' c
@@ -607,13 +608,14 @@ whitespace = B.space <$ (skipMany1 spaceChar <|> htmlComment)
<|> B.softbreak <$ endline
endline :: PandocMonad m => MWParser m ()
-endline = () <$ try (newline <*
- notFollowedBy spaceChar <*
- notFollowedBy newline <*
- notFollowedBy' hrule <*
- notFollowedBy tableStart <*
- notFollowedBy' header <*
- notFollowedBy anyListStart)
+endline = do
+ getState >>= guard . mwAllowNewlines
+ () <$ try (newline <* notFollowedBy spaceChar <*
+ notFollowedBy newline <*
+ notFollowedBy' hrule <*
+ notFollowedBy tableStart <*
+ notFollowedBy' header <*
+ notFollowedBy anyListStart)
imageIdentifier :: PandocMonad m => MWParser m ()
imageIdentifier = try $ do
diff --git a/src/Text/Pandoc/Writers/MediaWiki.hs b/src/Text/Pandoc/Writers/MediaWiki.hs
index 10823c8db..2991e4ebc 100644
--- a/src/Text/Pandoc/Writers/MediaWiki.hs
+++ b/src/Text/Pandoc/Writers/MediaWiki.hs
@@ -38,6 +38,7 @@ import Text.Pandoc.XML (escapeStringForXML)
data WriterState = WriterState {
stNotes :: Bool -- True if there are notes
, stOptions :: WriterOptions -- writer options
+ , stInDefLabel :: Bool -- True if in definition list label
}
data WriterReader = WriterReader {
@@ -51,7 +52,8 @@ type MediaWikiWriter m = ReaderT WriterReader (StateT WriterState m)
-- | Convert Pandoc to MediaWiki.
writeMediaWiki :: PandocMonad m => WriterOptions -> Pandoc -> m Text
writeMediaWiki opts document =
- let initialState = WriterState { stNotes = False, stOptions = opts }
+ let initialState = WriterState {
+ stNotes = False, stOptions = opts, stInDefLabel = False }
env = WriterReader { options = opts, listLevel = [], useTags = False }
in evalStateT (runReaderT (pandocToMediaWiki document) env) initialState
@@ -237,7 +239,9 @@ definitionListItemToMediaWiki :: PandocMonad m
=> ([Inline],[[Block]])
-> MediaWikiWriter m Text
definitionListItemToMediaWiki (label, items) = do
+ modify $ \st -> st{ stInDefLabel = True }
labelText <- inlineListToMediaWiki label
+ modify $ \st -> st{ stInDefLabel = False }
contents <- mapM blockListToMediaWiki items
tags <- asks useTags
if tags
@@ -446,7 +450,13 @@ inlineToMediaWiki (Cite _ lst) = inlineListToMediaWiki lst
inlineToMediaWiki (Code _ str) =
return $ "" <> escapeText str <> ""
-inlineToMediaWiki (Str str) = return $ escapeText str
+inlineToMediaWiki (Str str) = do
+ inDefLabel <- gets stInDefLabel
+ return $
+ if inDefLabel
+ then T.intercalate ":" $
+ map escapeText $ T.splitOn ":" str
+ else escapeText str
inlineToMediaWiki (Math mt str) = return $
"