git.iko.soy/typeable/pandoc
on master help sign in
Muse reader: parse anchors immediately after headings as IDs
commit0405c5b461ee8d9a57eacc5ff2b44fafa5c0637f authorAlexander Krotov <ilabdsf@gmail.com> dateThu 21 Dec 2017, 15:33 (9 years ago) parent5d3573e
4 files changed+27−6
src/Text/Pandoc/Readers/Muse.hs+9−5 src/Text/Pandoc/Writers/Muse.hs+1−1 test/Tests/Readers/Muse.hs+12 test/Tests/Writers/Muse.hs+5
src/Text/Pandoc/Readers/Muse.hs+9−5
@@ -31,7 +31,6 @@ Conversion of Muse text to 'Pandoc' document.
3131{-
3232TODO:
3333- Page breaks (five "*")
34−- Headings with anchors (make it round trip with Muse writer)
3534- Org tables
3635- table.el tables
3736- Images with attributes (floating and width)
@@ -241,7 +240,8 @@ header = try $ do
241240 guard $ level <= 5
242241 spaceChar
243242 content <- trimInlinesF . mconcat <$> manyTill inline eol
244− attr <- registerHeader ("", [], []) (runF content defaultParserState)
243+ anchorId <- option "" parseAnchor
244+ attr <- registerHeader (anchorId, [], []) (runF content defaultParserState)
245245 return $ B.headerWith attr level <$> content
246246
247247example :: PandocMonad m => MuseParser m (F Blocks)
@@ -629,14 +629,18 @@ endline = try $ do
629629 notFollowedBy blankline
630630 returnF B.softbreak
631631
632−anchor :: PandocMonad m => MuseParser m (F Inlines)
633−anchor = try $ do
632+parseAnchor :: PandocMonad m => MuseParser m String
633+parseAnchor = try $ do
634634 getPosition >>= \pos -> guard (sourceColumn pos == 1)
635635 char '#'
636636 first <- letter
637637 rest <- many (letter <|> digit)
638638 skipMany spaceChar <|> void newline
639− let anchorId = first:rest
639+ return $ first:rest
640+
641+anchor :: PandocMonad m => MuseParser m (F Inlines)
642+anchor = try $ do
643+ anchorId <- parseAnchor
640644 return $ return $ B.spanWith (anchorId, [], []) mempty
641645
642646footnote :: PandocMonad m => MuseParser m (F Inlines)
src/Text/Pandoc/Writers/Muse.hs+1−1
@@ -229,7 +229,7 @@ blockToMuse (Header level (ident,_,_) inlines) = do
229229 else "#" <> text ident <> cr
230230 let header' = text $ replicate level '*'
231231 return $ blankline <> nowrap (header' <> space <> contents)
232− <> blankline <> attr'
232+ $$ attr' <> blankline
233233-- https://www.gnu.org/software/emacs-muse/manual/muse.html#Horizontal-Rules-and-Anchors
234234blockToMuse HorizontalRule = return $ blankline $$ "----" $$ blankline
235235blockToMuse (Table caption _ _ headers rows) = do
test/Tests/Readers/Muse.hs+12
@@ -455,6 +455,18 @@ tests =
455455 , "</quote>"
456456 ] =?>
457457 blockQuote (para "* Hi")
458+ , "Headers consume anchors" =:
459+ T.unlines [ "** Foo"
460+ , "#bar"
461+ ] =?>
462+ headerWith ("bar",[],[]) 2 "Foo"
463+ , "Headers don't consume anchors separated with a blankline" =:
464+ T.unlines [ "** Foo"
465+ , ""
466+ , "#bar"
467+ ] =?>
468+ header 2 "Foo" <>
469+ para (spanWith ("bar", [], []) mempty)
458470 ]
459471 , testGroup "Directives"
460472 [ "Title" =:
test/Tests/Writers/Muse.hs+5
@@ -234,6 +234,11 @@ tests = [ testGroup "block elements"
234234 , ""
235235 , "*** Third level"
236236 ]
237+ , "heading with ID" =:
238+ headerWith ("bar", [], []) 2 (text "Foo") =?>
239+ unlines [ "** Foo"
240+ , "#bar"
241+ ]
237242 ]
238243 , "horizontal rule" =: horizontalRule =?> "----"
239244 , "escape horizontal rule" =: para (text "----") =?> "<verbatim>----</verbatim>"