@@ -263,8 +263,8 @@ parseBlocks =
263 paraStart)
263 paraStart)
265 parseEnd = mempty <$ eof
265 parseEnd = mempty <$ eof
266− blockStart = (B.<>) <$> (header <|> blockElements <|> emacsNoteBlock)
266+ blockStart = ((B.<>) <$> (emacsHeading <|> blockElements <|> emacsNoteBlock)
267− <*> parseBlocks
267+ <*> parseBlocks) <|> (uncurry (B.<>) <$> amuseHeadingUntil parseBlocks)
268 listStart = do
268 listStart = do
269 updateState (\st -> st { museInPara = False })
269 updateState (\st -> st { museInPara = False })
270 uncurry (B.<>) <$> (anyListUntil parseBlocks <|> amuseNoteBlockUntil parseBlocks)
270 uncurry (B.<>) <$> (anyListUntil parseBlocks <|> amuseNoteBlockUntil parseBlocks)
@@ -362,9 +362,10 @@ separator = try $ do
363 return $ return B.horizontalRule
363 return $ return B.horizontalRule
365−-- | Parse a heading.
365+-- | Parse a single-line heading.
366−header :: PandocMonad m => MuseParser m (F Blocks)
366+emacsHeading :: PandocMonad m => MuseParser m (F Blocks)
367−header = try $ do
367+emacsHeading = try $ do
368+ guardDisabled Ext_amuse
368 anchorId <- option "" $ try (parseAnchor <* manyTill spaceChar eol)
369 anchorId <- option "" $ try (parseAnchor <* manyTill spaceChar eol)
369 getPosition >>= \pos -> guard (sourceColumn pos == 1)
370 getPosition >>= \pos -> guard (sourceColumn pos == 1)
370 level <- fmap length $ many1 $ char '*'
371 level <- fmap length $ many1 $ char '*'
@@ -374,6 +375,22 @@ header = try $ do
374 attr <- registerHeader (anchorId, [], []) (runF content def)
375 attr <- registerHeader (anchorId, [], []) (runF content def)
375 return $ B.headerWith attr level <$> content
376 return $ B.headerWith attr level <$> content
378+-- | Parse a multi-line heading.
379+-- It is a Text::Amuse extension, Emacs Muse does not allow heading to span multiple lines.
380+amuseHeadingUntil :: PandocMonad m
381+ => MuseParser m a -- ^ Terminator parser
382+ -> MuseParser m (F Blocks, a)
383+amuseHeadingUntil end = try $ do
384+ guardEnabled Ext_amuse
385+ anchorId <- option "" $ try (parseAnchor <* manyTill spaceChar eol)
386+ getPosition >>= \pos -> guard (sourceColumn pos == 1)
387+ level <- fmap length $ many1 $ char '*'
390+ (content, e) <- paraContentsUntil end
391+ attr <- registerHeader (anchorId, [], []) (runF content def)
392+ return (B.headerWith attr level <$> content, e)
377-- | Parse an example between @{{{@ and @}}}@.
394-- | Parse an example between @{{{@ and @}}}@.
378-- It is an Amusewiki extension influenced by Creole wiki, as described in @Text::Amuse@ documentation.
395-- It is an Amusewiki extension influenced by Creole wiki, as described in @Text::Amuse@ documentation.
379example :: PandocMonad m => MuseParser m (F Blocks)
396example :: PandocMonad m => MuseParser m (F Blocks)
@@ -461,6 +478,16 @@ verseTag = do
461commentTag :: PandocMonad m => MuseParser m (F Blocks)
478commentTag :: PandocMonad m => MuseParser m (F Blocks)
462commentTag = htmlBlock "comment" >> return mempty
479commentTag = htmlBlock "comment" >> return mempty
481+-- | Parse paragraph contents.
482+paraContentsUntil :: PandocMonad m
483+ => MuseParser m a -- ^ Terminator parser
484+ -> MuseParser m (F Inlines, a)
485+paraContentsUntil end = do
486+ updateState (\st -> st { museInPara = True })
487+ (l, e) <- someUntil inline $ try (manyTill spaceChar eol >> end)
488+ updateState (\st -> st { museInPara = False })
489+ return (trimInlinesF $ mconcat l, e)
464-- | Parse a paragraph.
491-- | Parse a paragraph.
465paraUntil :: PandocMonad m
492paraUntil :: PandocMonad m
466 => MuseParser m a -- ^ Terminator parser
493 => MuseParser m a -- ^ Terminator parser
@@ -468,10 +495,7 @@ paraUntil :: PandocMonad m
468paraUntil end = do
495paraUntil end = do
469 state <- getState
496 state <- getState
470 guard $ not $ museInPara state
497 guard $ not $ museInPara state
471− setState $ state{ museInPara = True }
498+ first (fmap B.para) <$> paraContentsUntil end
472− (l, e) <- someUntil inline $ try (manyTill spaceChar eol >> end)
473− updateState (\st -> st { museInPara = False })
474− return (fmap B.para $ trimInlinesF $ mconcat l, e)
476noteMarker :: PandocMonad m => MuseParser m String
500noteMarker :: PandocMonad m => MuseParser m String
477noteMarker = try $ do
501noteMarker = try $ do