@@ -186,6 +186,29 @@ atStart p = do
186 guard $ museLastStrPos st /= Just pos
186 guard $ museLastStrPos st /= Just pos
189+-- Like manyTill, but also returns result of end parser
190+manyUntil :: (Stream s m t)
193+ -> ParserT s u m ([a], b)
194+manyUntil p end = scan
203+someUntil :: (Stream s m t)
206+ -> ParserT s u m ([a], b)
209+ (rest, e) <- manyUntil p end
210+ return (first:rest, e)
190-- directive parsers
213-- directive parsers
@@ -368,15 +391,20 @@ commentTag :: PandocMonad m => MuseParser m (F Blocks)
368commentTag = htmlElement "comment" >> return mempty
391commentTag = htmlElement "comment" >> return mempty
370-- Indented paragraph is either center, right or quote
393-- Indented paragraph is either center, right or quote
394+paraUntil :: PandocMonad m
396+ -> MuseParser m (F Blocks, a)
398+ indent <- length <$> many spaceChar
399+ st <- museInList <$> getState
400+ let f = if not st && indent >= 2 && indent < 6 then B.blockQuote else id
401+ (l, e) <- someUntil inline $ try end
402+ let p = fmap (f . B.para) $ trimInlinesF $ mconcat l
371para :: PandocMonad m => MuseParser m (F Blocks)
405para :: PandocMonad m => MuseParser m (F Blocks)
373− indent <- length <$> many spaceChar
374− st <- museInList <$> getState
375− let f = if not st && indent >= 2 && indent < 6 then B.blockQuote else id
376− fmap (f . B.para) . trimInlinesF . mconcat <$> many1Till inline endOfParaElement
378− endOfParaElement = try (eof <|> newBlockElement)
379− newBlockElement = blankline >> void (lookAhead blockElements)
407+ fst <$> paraUntil (try (eof <|> (blankline >> void (lookAhead blockElements))))
381noteMarker :: PandocMonad m => MuseParser m String
409noteMarker :: PandocMonad m => MuseParser m String
382noteMarker = try $ do
410noteMarker = try $ do