aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn MacFarlane <[email protected]>2025-03-21 21:54:47 -0700
committerJohn MacFarlane <[email protected]>2025-03-21 21:54:47 -0700
commit59fb9c40de5cdb3f5842c5519c88cb1175b757d8 (patch)
treee966fd42740d020ab3fb37d35f851db2c323a198 /src
parent6b467b55a007c8781129ef98055dd7e1df09b9b2 (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.hs24
-rw-r--r--src/Text/Pandoc/Writers/MediaWiki.hs14
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=\"" <>