diff options
| author | John MacFarlane <[email protected]> | 2025-03-21 21:54:47 -0700 |
|---|---|---|
| committer | John MacFarlane <[email protected]> | 2025-03-21 21:54:47 -0700 |
| commit | 59fb9c40de5cdb3f5842c5519c88cb1175b757d8 (patch) | |
| tree | e966fd42740d020ab3fb37d35f851db2c323a198 /src | |
| parent | 6b467b55a007c8781129ef98055dd7e1df09b9b2 (diff) | |
MediaWiki reader/writer: allow definition on same line as term.
Closes #10708.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Text/Pandoc/Readers/MediaWiki.hs | 24 | ||||
| -rw-r--r-- | src/Text/Pandoc/Writers/MediaWiki.hs | 14 |
2 files changed, 25 insertions, 13 deletions
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 $ "<code>" <> escapeText str <> "</code>" -inlineToMediaWiki (Str str) = return $ escapeText str +inlineToMediaWiki (Str str) = do + inDefLabel <- gets stInDefLabel + return $ + if inDefLabel + then T.intercalate "<nowiki>:</nowiki>" $ + map escapeText $ T.splitOn ":" str + else escapeText str inlineToMediaWiki (Math mt str) = return $ "<math display=\"" <> |
