@@ -45,7 +45,7 @@ import Control.Applicative ( Applicative, pure
4545 , (<$>), (<$), (<*>), (<*), (*>), (<**>) )
4646import Control.Monad (foldM, guard, liftM, liftM2, when)
4747import Control.Monad.Reader (Reader, runReader, ask, asks)
48−import Data.Char (toLower)
48+import Data.Char (isAlphaNum, toLower)
4949import Data.Default
5050import Data.List (intersperse, isPrefixOf, isSuffixOf)
5151import qualified Data.Map as M
@@ -209,6 +209,9 @@ instance Monoid a => Monoid (F a) where
209209trimInlinesF :: F Inlines -> F Inlines
210210trimInlinesF = liftM trimInlines
211211
212+returnF :: a -> OrgParser (F a)
213+returnF = return . return
214+
212215
213216-- | Like @Text.Parsec.Char.newline@, but causes additional state changes.
214217newline :: OrgParser Char
@@ -291,9 +294,6 @@ orgBlock = try $ do
291294 "src" -> codeBlockWithAttr classArgs content
292295 _ -> return $ B.divWith ("", [blockType], []) <$> contentBlocks
293296 where
294− returnF :: a -> OrgParser (F a)
295− returnF = return . return
296−
297297 parseVerse :: String -> OrgParser (F Blocks)
298298 parseVerse cs =
299299 fmap B.para . mconcat . intersperse (pure B.linebreak)
@@ -834,7 +834,11 @@ noteMarker = try $ do
834834 ]
835835
836836linkOrImage :: OrgParser (F Inlines)
837−linkOrImage = explicitOrImageLink <|> selflinkOrImage <?> "link or image"
837+linkOrImage = explicitOrImageLink
838+ <|> selflinkOrImage
839+ <|> angleLink
840+ <|> plainLink
841+ <?> "link or image"
838842
839843explicitOrImageLink :: OrgParser (F Inlines)
840844explicitOrImageLink = try $ do
@@ -851,15 +855,27 @@ explicitOrImageLink = try $ do
851855selflinkOrImage :: OrgParser (F Inlines)
852856selflinkOrImage = try $ do
853857 src <- char '[' *> linkTarget <* char ']'
854− return . return $ if isImageFilename src
855− then B.image src "" ""
856− else B.link src "" (B.str src)
858+ returnF $ if isImageFilename src
859+ then B.image src "" ""
860+ else B.link src "" (B.str src)
861+
862+plainLink :: OrgParser (F Inlines)
863+plainLink = try $ do
864+ (orig, src) <- uri
865+ returnF $ B.link src "" (B.str orig)
866+
867+angleLink :: OrgParser (F Inlines)
868+angleLink = try $ do
869+ char '<'
870+ link <- plainLink
871+ char '>'
872+ return link
857873
858874selfTarget :: OrgParser String
859875selfTarget = try $ char '[' *> linkTarget <* char ']'
860876
861877linkTarget :: OrgParser String
862−linkTarget = enclosed (char '[') (char ']') (noneOf "\n\r]")
878+linkTarget = enclosed (char '[') (char ']') (noneOf "\n\r[]")
863879
864880isImageFilename :: String -> Bool
865881isImageFilename filename =