From bdf8c01f2c0e3d3cd549c19b118c332cd48eeeb0 Mon Sep 17 00:00:00 2001 From: Alexander Krotov Date: Mon, 28 May 2018 01:24:09 +0300 Subject: Muse reader: split link and image parsing into separate functions --- src/Text/Pandoc/Readers/Muse.hs | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/Text/Pandoc/Readers/Muse.hs b/src/Text/Pandoc/Readers/Muse.hs index e49648506..e8b7d24f7 100644 --- a/src/Text/Pandoc/Readers/Muse.hs +++ b/src/Text/Pandoc/Readers/Muse.hs @@ -778,7 +778,7 @@ inlineList = [ whitespace , verbatimTag , classTag , nbsp - , link + , linkOrImage , code , codeTag , mathTag @@ -942,17 +942,17 @@ symbol :: PandocMonad m => MuseParser m (F Inlines) symbol = return . B.str <$> count 1 nonspaceChar -- | Parse a link or image. -link :: PandocMonad m => MuseParser m (F Inlines) -link = try $ do +linkOrImage :: PandocMonad m => MuseParser m (F Inlines) +linkOrImage = try $ do st <- getState guard $ not $ museInLink st setState $ st{ museInLink = True } - res <- explicitLink <|> linkText + res <- explicitLink <|> image <|> link updateState (\state -> state { museInLink = False }) return res linkContent :: PandocMonad m => MuseParser m (F Inlines) -linkContent = char '[' >> trimInlinesF . mconcat <$> manyTill inline (string "]") +linkContent = char '[' >> trimInlinesF . mconcat <$> manyTill inline (char ']') -- | Parse a link starting with @URL:@ explicitLink :: PandocMonad m => MuseParser m (F Inlines) @@ -963,15 +963,22 @@ explicitLink = try $ do char ']' return $ B.link url "" <$> content -linkText :: PandocMonad m => MuseParser m (F Inlines) -linkText = do +image :: PandocMonad m => MuseParser m (F Inlines) +image = try $ do string "[[" url <- manyTill anyChar $ char ']' content <- optionMaybe linkContent char ']' - return $ if isImageUrl url - then B.image url "" <$> fromMaybe (return mempty) content - else B.link url "" <$> fromMaybe (return $ B.str url) content + guard $ isImageUrl url + return $ B.image url "" <$> fromMaybe (return mempty) content where -- Taken from muse-image-regexp defined in Emacs Muse file lisp/muse-regexps.el imageExtensions = [".eps", ".gif", ".jpg", ".jpeg", ".pbm", ".png", ".tiff", ".xbm", ".xpm"] isImageUrl = (`elem` imageExtensions) . takeExtension + +link :: PandocMonad m => MuseParser m (F Inlines) +link = try $ do + string "[[" + url <- manyTill anyChar $ char ']' + content <- optionMaybe linkContent + char ']' + return $ B.link url "" <$> fromMaybe (return $ B.str url) content -- cgit v1.2.3