git.iko.soy/typeable/pandoc
on master help sign in
Muse reader: paragraph indentation does not indicate nested quote
3480a8aAlexander Krotov
src/Text/Pandoc/Readers/Muse.hs+10−35
@@ -81,8 +81,6 @@ data MuseState = MuseState { museMeta :: F Meta -- ^ Document metadata
81 , museLastStrPos :: Maybe SourcePos -- ^ Position after last str parsed
81 , museLastStrPos :: Maybe SourcePos -- ^ Position after last str parsed
82 , museLogMessages :: [LogMessage]
82 , museLogMessages :: [LogMessage]
83 , museNotes :: M.Map String (SourcePos, F Blocks)
83 , museNotes :: M.Map String (SourcePos, F Blocks)
84− , museInQuote :: Bool
85− , museInList :: Bool
86 , museInLink :: Bool
84 , museInLink :: Bool
87 }
85 }
88
86
@@ -97,8 +95,6 @@ defaultMuseState = MuseState { museMeta = return nullMeta
97 , museLastStrPos = Nothing
95 , museLastStrPos = Nothing
98 , museLogMessages = []
96 , museLogMessages = []
99 , museNotes = M.empty
97 , museNotes = M.empty
100− , museInQuote = False
101− , museInList = False
102 , museInLink = False
98 , museInLink = False
103 }
99 }
104
100
@@ -256,11 +252,14 @@ parseBlocks =
256 try blockStart <|>
252 try blockStart <|>
257 try paraStart
253 try paraStart
258 where
254 where
259− blockStart = do first <- blockElements
255+ blockStart = do first <- header <|> blockElements <|> amuseNoteBlock <|> emacsNoteBlock
260 rest <- parseBlocks
256 rest <- parseBlocks
261 return $ first B.<> rest
257 return $ first B.<> rest
258+ paraStart = do
259+ indent <- length <$> many spaceChar
262− paraStart = do (first, rest) <- paraUntil ((mempty <$ eof) <|> blockStart)
260+ (first, rest) <- paraUntil ((mempty <$ eof) <|> blockStart)
261+ let first' = if indent >= 2 && indent < 6 then B.blockQuote <$> first else first
263− return $ first B.<> rest
262+ return $ first' B.<> rest
264
263
265parseBlock :: PandocMonad m => MuseParser m (F Blocks)
264parseBlock :: PandocMonad m => MuseParser m (F Blocks)
266parseBlock = do
265parseBlock = do
@@ -273,7 +272,6 @@ blockElements :: PandocMonad m => MuseParser m (F Blocks)
273blockElements = choice [ mempty <$ blankline
272blockElements = choice [ mempty <$ blankline
274 , comment
273 , comment
275 , separator
274 , separator
276− , header
277 , example
275 , example
278 , exampleTag
276 , exampleTag
279 , literalTag
277 , literalTag
@@ -288,8 +286,6 @@ blockElements = choice [ mempty <$ blankline
288 , definitionList
286 , definitionList
289 , table
287 , table
290 , commentTag
288 , commentTag
291− , amuseNoteBlock
292− , emacsNoteBlock
293 ]
289 ]
294
290
295comment :: PandocMonad m => MuseParser m (F Blocks)
291comment :: PandocMonad m => MuseParser m (F Blocks)
@@ -309,9 +305,7 @@ separator = try $ do
309
305
310header :: PandocMonad m => MuseParser m (F Blocks)
306header :: PandocMonad m => MuseParser m (F Blocks)
311header = try $ do
307header = try $ do
312− st <- museInList <$> getState
313− q <- museInQuote <$> getState
314− getPosition >>= \pos -> guard (not st && not q && sourceColumn pos == 1)
308+ getPosition >>= \pos -> guard (sourceColumn pos == 1)
315 level <- fmap length $ many1 $ char '*'
309 level <- fmap length $ many1 $ char '*'
316 guard $ level <= 5
310 guard $ level <= 5
317 spaceChar
311 spaceChar
@@ -370,13 +364,7 @@ rightTag :: PandocMonad m => MuseParser m (F Blocks)
370rightTag = snd <$> parseHtmlContent "right"
364rightTag = snd <$> parseHtmlContent "right"
371
365
372quoteTag :: PandocMonad m => MuseParser m (F Blocks)
366quoteTag :: PandocMonad m => MuseParser m (F Blocks)
373−quoteTag = do
367+quoteTag = (fmap B.blockQuote) <$> snd <$> parseHtmlContent "quote"
374− st <- getState
375− let oldInQuote = museInQuote st
376− setState $ st{ museInQuote = True }
377− res <- snd <$> parseHtmlContent "quote"
378− setState $ st{ museInQuote = oldInQuote }
379− return $ B.blockQuote <$> res
380
368
381-- <div> tag is supported by Emacs Muse, but not Amusewiki 2.025
369-- <div> tag is supported by Emacs Muse, but not Amusewiki 2.025
382divTag :: PandocMonad m => MuseParser m (F Blocks)
370divTag :: PandocMonad m => MuseParser m (F Blocks)
@@ -408,12 +396,8 @@ paraUntil :: PandocMonad m
408 => MuseParser m a
396 => MuseParser m a
409 -> MuseParser m (F Blocks, a)
397 -> MuseParser m (F Blocks, a)
410paraUntil end = do
398paraUntil end = do
411− indent <- length <$> many spaceChar
412− st <- museInList <$> getState
413− let f = if not st && indent >= 2 && indent < 6 then B.blockQuote else id
414 (l, e) <- someUntil inline $ try (manyTill spaceChar eol >> end)
399 (l, e) <- someUntil inline $ try (manyTill spaceChar eol >> end)
415− let p = fmap (f . B.para) $ trimInlinesF $ mconcat l
400+ return (fmap (B.para) $ trimInlinesF $ mconcat l, e)
416− return (p, e)
417
401
418noteMarker :: PandocMonad m => MuseParser m String
402noteMarker :: PandocMonad m => MuseParser m String
419noteMarker = try $ do
403noteMarker = try $ do
@@ -481,18 +465,9 @@ lineBlock = try $ do
481-- lists
465-- lists
482--
466--
483
467
484−withListContext :: PandocMonad m => MuseParser m a -> MuseParser m a
485−withListContext p = do
486− state <- getState
487− let oldInList = museInList state
488− setState $ state { museInList = True }
489− parsed <- p
490− updateState (\st -> st { museInList = oldInList })
491− return parsed
492−
493listItemContents' :: PandocMonad m => Int -> MuseParser m (F Blocks)
468listItemContents' :: PandocMonad m => Int -> MuseParser m (F Blocks)
494listItemContents' col =
469listItemContents' col =
495− mconcat <$> withListContext (parseBlock `sepBy1` try (skipMany blankline >> indentWith col))
470+ mconcat <$> parseBlock `sepBy1` try (skipMany blankline >> indentWith col)
496
471
497listItemContents :: PandocMonad m => MuseParser m (F Blocks)
472listItemContents :: PandocMonad m => MuseParser m (F Blocks)
498listItemContents = do
473listItemContents = do
test/Tests/Readers/Muse.hs+6
@@ -252,6 +252,12 @@ tests =
252 , "Quote" =:
252 , "Quote" =:
253 " This is a quotation\n" =?>
253 " This is a quotation\n" =?>
254 blockQuote (para "This is a quotation")
254 blockQuote (para "This is a quotation")
255+ , "Indentation does not indicate quote inside quote tag" =:
256+ T.unlines [ "<quote>"
257+ , " Not a nested quote"
258+ , "</quote>"
259+ ] =?>
260+ blockQuote (para "Not a nested quote")
255 , "Multiline quote" =:
261 , "Multiline quote" =:
256 T.unlines [ " This is a quotation"
262 T.unlines [ " This is a quotation"
257 , " with a continuation"
263 , " with a continuation"