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 $ " diff --git a/test/command/10708.md b/test/command/10708.md new file mode 100644 index 000000000..d8296dd95 --- /dev/null +++ b/test/command/10708.md @@ -0,0 +1,24 @@ +``` +% pandoc -f html -t mediawiki +
+
Case 1: Both subsets are non-empty
+
+In this case, … +
+
+^D +; Case 1: Both subsets are non-empty +: In this case, … +``` + +``` +% pandoc -f mediawiki -t html +; term : definition +^D +
+
term
+
+definition +
+
+```