From b5d064e8f08db27f3f9aa7287edd7a777be57594 Mon Sep 17 00:00:00 2001
From: Alexander Krotov <ilabdsf@gmail.com>
Date: Thu, 28 Sep 2017 14:47:07 +0300
Subject: [PATCH] Muse reader: parse anchors

---
 src/Text/Pandoc/Readers/Muse.hs | 12 +++++++++++-
 test/Tests/Readers/Muse.hs      | 20 ++++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/src/Text/Pandoc/Readers/Muse.hs b/src/Text/Pandoc/Readers/Muse.hs
index 6e7844d4b..6f9b9b3c2 100644
--- a/src/Text/Pandoc/Readers/Muse.hs
+++ b/src/Text/Pandoc/Readers/Muse.hs
@@ -35,7 +35,6 @@ TODO:
 - Org tables
 - table.el tables
 - Images with attributes (floating and width)
-- Anchors
 - Citations and <biblio>
 - <play> environment
 -}
@@ -535,6 +534,7 @@ tableParseCaption = try $ do
 
 inline :: PandocMonad m => MuseParser m (F Inlines)
 inline = choice [ br
+                , anchor
                 , footnote
                 , strong
                 , strongTag
@@ -552,6 +552,16 @@ inline = choice [ br
                 , symbol
                 ] <?> "inline"
 
+anchor :: PandocMonad m => MuseParser m (F Inlines)
+anchor = try $ do
+  getPosition >>= \pos -> guard (sourceColumn pos == 1)
+  char '#'
+  first <- letter
+  rest <- many (letter <|> digit)
+  skipMany spaceChar <|> void newline
+  let anchorId = first:rest
+  return $ return $ B.spanWith (anchorId, [], []) mempty
+
 footnote :: PandocMonad m => MuseParser m (F Inlines)
 footnote = try $ do
   ref <- noteMarker
diff --git a/test/Tests/Readers/Muse.hs b/test/Tests/Readers/Muse.hs
index 3088f88b3..f89c58d3f 100644
--- a/test/Tests/Readers/Muse.hs
+++ b/test/Tests/Readers/Muse.hs
@@ -344,6 +344,26 @@ tests =
                     ] =?>
           blockQuote (para "* Hi")
         ]
+      , testGroup "Anchors"
+        [ "Anchor" =:
+          T.unlines [ "; A comment to make sure anchor is not parsed as a directive"
+                    , "#anchor Target"
+                    ] =?>
+          para (spanWith ("anchor", [], []) mempty <> "Target")
+        , "Anchor cannot start with a number" =:
+          T.unlines [ "; A comment to make sure anchor is not parsed as a directive"
+                    , "#0notanchor Target"
+                    ] =?>
+          para "#0notanchor Target"
+        , "Not anchor if starts with a space" =:
+          " #notanchor Target" =?>
+          para "#notanchor Target"
+        , "Anchor inside a paragraph" =:
+          T.unlines [ "Paragraph starts here"
+                    , "#anchor and ends here."
+                    ] =?>
+          para ("Paragraph starts here " <> spanWith ("anchor", [], []) mempty <> "and ends here.")
+        ]
       , testGroup "Footnotes"
         [ "Simple footnote" =:
           T.unlines [ "Here is a footnote[1]."