@@ -186,6 +186,29 @@ atStart p = do
186186 guard $ museLastStrPos st /= Just pos
187187 p
188188
189+-- Like manyTill, but also returns result of end parser
190+manyUntil :: (Stream s m t)
191+ => ParserT s u m a
192+ -> ParserT s u m b
193+ -> ParserT s u m ([a], b)
194+manyUntil p end = scan
195+ where scan =
196+ (do e <- end
197+ return ([], e)
198+ ) <|>
199+ (do x <- p
200+ (xs, e) <- scan
201+ return (x:xs, e))
202+
203+someUntil :: (Stream s m t)
204+ => ParserT s u m a
205+ -> ParserT s u m b
206+ -> ParserT s u m ([a], b)
207+someUntil p end = do
208+ first <- p
209+ (rest, e) <- manyUntil p end
210+ return (first:rest, e)
211+
189212--
190213-- directive parsers
191214--
@@ -368,15 +391,20 @@ commentTag :: PandocMonad m => MuseParser m (F Blocks)
368391commentTag = htmlElement "comment" >> return mempty
369392
370393-- Indented paragraph is either center, right or quote
394+paraUntil :: PandocMonad m
395+ => MuseParser m a
396+ -> MuseParser m (F Blocks, a)
397+paraUntil end = do
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
403+ return (p, e)
404+
371405para :: PandocMonad m => MuseParser m (F Blocks)
372−para = do
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
377− where
378− endOfParaElement = try (eof <|> newBlockElement)
379− newBlockElement = blankline >> void (lookAhead blockElements)
406+para =
407+ fst <$> paraUntil (try (eof <|> (blankline >> void (lookAhead blockElements))))
380408
381409noteMarker :: PandocMonad m => MuseParser m String
382410noteMarker = try $ do